7

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

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

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

} //works fine

对比

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

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

} //error
4

5 回答 5

9

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

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

例如,您可以这样做:

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

但是,你不能做这样愚蠢的事情:

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

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

于 2013-04-10T12:51:26.337 回答
2

改成

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

于 2013-04-10T12:45:02.790 回答
1

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

正如你所说,c1是一个数组。因此,您必须将其声明为指向char.

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

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

于 2013-04-10T12:43:37.437 回答
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. 

这是同样的事情,除了整数。

于 2013-04-10T12:49:14.463 回答
0

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

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

于 2013-04-10T12:48:10.413 回答