我有以下代码
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
的类型是什么?
答案 0 :(得分:7)
由于str
是一个数组,&str
的类型是“指向12 const
char
数组的指针”。有效的声明是:
char const (*str4)[12] = &str;
str3
的声明工作正常,因为str2
是“指向const
char
”的指针,而不是使用数组到指针转换初始化的数组。获取数组地址时不会发生相同的数组到指针转换,如str4
的声明中那样。
答案 1 :(得分:0)
由于参考人数的多少。 (str []或str *) - > data,str2 - >数据,str3 - >指针(str2) - > data,str4 - >指针 - >数据。 * simbols的数量告诉你许多你需要取消引用它以获取数据的imes。每次都是从一个地址跳到另一个地址,只有最后一次访问才是数据。
正确的方法是:
char const* str4 = &str; //or
char const* str4 = str2;