4

我有以下代码

char str[] = "some string"; // legal
char const* str2 = str;     // legal
char const** str3 = &str2;  // legal
char const** str4 = &str;   // illegal (error: cannot convert 'char (*)[12]' to 'const char (*)[]' in initialization )

为什么最后一个没有编译?是什么类型的&str

4

2 回答 2

7

因为str是数组,所以类型&str是“指向 12 数组的指针const char”。有效的声明是:

char const (*str4)[12] = &str;

声明str3工作正常,因为str2是“指向”的指针const char,而不是数组,使用数组到指针的转换进行初始化。当您获取数组的地址时,不会发生相同的数组到指针的转换,如str4.

于 2013-03-18T17:22:03.467 回答
0

因为取消引用的数量。(str[] 或 str*) -> 数据,str2 -> 数据,str3 -> 指针(str2) -> 数据,str4 -> 指针 -> 数据。* simbols 的数量告诉您很多次,您需要取消引用它才能获取数据。每次都是从一个地址跳到另一个地址,只有最后一次访问实际上是数据。

正确的方法是:

char const* str4 = &str; //or
char const* str4 = str2;
于 2013-03-18T17:26:25.010 回答