如果我写:
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和工作?为什么不呢?
在这种情况下,这不是衰变的作用方式.见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)