C - 为什么指向指针与指向数组的指针不一样?

201*_*ker 3 c arrays pointers

如果我写:

char string[] = "some string";
char **ptr = &string;
printf("%s\n",*ptr);
Run Code Online (Sandbox Code Playgroud)

它什么都不打印并发出警告: warning: initialization from incompatible pointer type [enabled by default]

现在,如果我写下面的内容:

char *string = "another string";
char **ptr = &string;
printf("%s\n",*ptr);
Run Code Online (Sandbox Code Playgroud)

它可以正常工作.

不应该string[]腐烂到类似的指针*string和工作?为什么不呢?

Tim*_*nes 9

在这种情况下,这不是衰变的作用方式.见C faq:

6.12问: 由于数组引用衰减为指针,如果arr是数组,那么arr和之间有什么区别&arr

答: 在标准C中&arr,向整个数组产生一个指向类型指针的指针.

所以,当你这样做时:

char string[] = "some string";
char **ptr = &string;
Run Code Online (Sandbox Code Playgroud)

赋值失败,因为&string类型为"指向长度为12的char数组的指针".你可以写:

char (*ptr)[12] = &string; 
Run Code Online (Sandbox Code Playgroud)

哪个(虽然几乎肯定不是你想要做的)读取"声明ptr作为指向12个字符数组的指针"

如果你真的想要一个指向指针的指针,那么你总是可以使用一个中间变量:

char string[] = "some string";
char *ptr = string;
char **doublepointer = &ptr;
printf("%s",*doublepointer);
Run Code Online (Sandbox Code Playgroud)