繁体   English   中英

char ** vs char * c []用于访问字符串数组

[英]char** vs char* c[] for accessing a string array

为什么我不能将char **指向C字符串数组?

int main(int argc, char *argv[]) {

    char* c1[] = {"Hey","Hello"};
    printf("%s",c1[1]);

} //works fine

VS

int main(int argc, char *argv[]) {

    char** c1 = {"Hey","Hello"};
    printf("%s",c1[1]);

} //error

我认为这里的混乱源于相信{"Hey","Hello"}是一个数组。 不是。 它根本不是一个对象。 它只是一种特殊的初始化语法,可用于初始化数组。 您不能使用它来初始化char**因为char**是指针而不是数组。 它不会自动创建可以转换为指针的数组对象。

也许你是一个喜欢思考的是[...]列表在Python或{ ... }在JavaScript对象。 它根本不像那些。 这些表达式实际上创建了该类型的对象,并且可以在可以接受这些对象的表达式中的任何位置使用。 我们在C ++中使用的语法只是一种初始化语法。

例如,您可以这样做:

const char* array[] = {"Hey","Hello"};
const char** p = array;

但是,你不能做这样的傻事:

std::cout << {"Hey", "Hello"}[1];

这里我们实际创建了存储指针的数组对象。 只有这样我们才能将该数组转换为const char**

改成

char** c1 = (char *[]){"Hey","Hello"};

为什么我不能将char**指向C字符串数组?

如你所说, c1是一个数组。 所以你必须将它声明为char的指针数组

由于"Hey""Hello"字符串litterals ,因此每个c1[i]字符串都指向一个匿名字符串。 这就是为什么你可以使用char而不是char数组的指针。

但是,要创建指向char的指针数组,则不能使用char **

“char ** c1”告诉编译器它是一个指向char类型指针的指针,是标量类型(一个值)。

使用值列表进行初始化仅适用于聚合类型。

int main(int argc, char *argv[]) {

    char** c1 = {"Hey","Hello"};
    printf("%s",c1[1]);

} //error

在上面的代码中,您尝试设置指向指向一组两个字符串的指针。 哪两个指针的存储分别包含“Hey”和“Hello”的地址? 无处。

你可以这样做:

 char *a = "Hey";
 char *b = "Hello";
 char *c[] = { a, b };     // This MAY not compile due to a and b not being compile time constants. 
 char **c1 = c;

(我把它分成了比实际需要更多的单个变量,但我认为它很清楚地解释了代码的“错误”)。

另一个例子是如果我们将char *更改为int:

 const int a = 1;
 const int b = 2;

 int c[] = { a, b };

 int *c = { a, b };   // Doesn't work, there is nowhere to store a copy of a and b. 

这是一回事,除了整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM