为什么我不能将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
答案 0 :(得分:6)
我认为这里的困惑源于{"Hey","Hello"}
是一个数组的信念。不是。它根本不是一个对象。它只是一种特殊的初始化语法,可用于初始化数组。您无法使用它初始化char**
,因为char**
是指针而不是数组。它不会自动创建可以转换为指针的数组对象。
也许您将其视为Python中的[...]
列表或JavaScript中的{ ... }
对象。它根本不像那些。这些表达式实际上创建了该类型的对象,并且可以在可以接受这些对象的表达式中的任何位置使用。我们在C ++中使用的语法是只是初始化语法。
例如,可以执行此操作:
const char* array[] = {"Hey","Hello"};
const char** p = array;
但是,你不能做这样愚蠢的事情:
std::cout << {"Hey", "Hello"}[1];
这里我们实际上已经创建了存储指针的数组对象。只有这样我们才能将该数组转换为const char**
。
答案 1 :(得分:2)
更改为
char** c1 = (char *[]){"Hey","Hello"};
答案 2 :(得分:1)
为什么我不能将
char**
指向C字符串数组?
如你所说,c1
是一个数组。因此,您必须将其声明为指向char
的指针数组。
由于"Hey"
和"Hello"
是字符串litterals ,因此每个c1[i]
字符串指向为匿名字符串。这就是为什么你可以使用char
而不是char
数组的指针。
要制作指向char
的指针数组,您不能使用char **
。
答案 3 :(得分:0)
“char ** c1”,告诉编译器它是一个指向char类型指针的指针,是标量类型(一个值)。
使用值列表初始化仅适用于聚合类型。
答案 4 :(得分:0)
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.
除了整数外,它是一样的。