C++ 数组的引用

C++ 数组的引用,c++,arrays,pointers,C++,Arrays,Pointers,我有以下代码 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 ) 为什么最

我有以下代码

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
的类型是什么?

由于
str
是一个数组,因此
&str
的类型是“指向12个
常量的数组的指针”。有效声明为:

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

str3
的声明工作正常,因为
str2
是一个“指向
const
char
的指针”,而不是一个数组,使用数组到指针的转换进行初始化。当您获取数组的地址时,不会发生相同的数组到指针的转换,如str4的声明中所述,因为取消引用的数量太多。(str[]或str*)->数据,str2->数据,str3->指针(str2)-->数据,str4->指针->数据。*simbols的数量告诉你很多次你需要去引用它来获取数据。每次从一个地址跳到另一个地址,只有最后一次访问才是实际数据

正确的方法是:

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

最后一个给出的错误是什么?数组不是指针我可以做些什么来调整这个声明以适应任意长度的数组?例如,我尝试了
char-const(*str4)[
,但出现了一个错误。@user14416您不能-它是指向特定长度数组的指针。