语言与表示之间永远存在脱钩。
在某种程度上,C 几乎是Dissendium。
以上面的例子为例,我们试图将二维数组赋值或转换成另一种形式,
#include <stdio.h>
int main()
{
char array[2][6] = {"hello", "hai"};
int h, i;
for (h = 0; h < 2; h++)
for (i = 0; i < 6; i++)
printf("%c\n", *(*(array+h) + i));
char (*p)[6] = array;
for (h = 0; h < 2; h++)
for (i = 0; i < 6; i++)
printf("%c\n", *(*(p+h) + i));
char **x = array;
for (h = 0; h < 2; h++)
printf("%c\n", *(x+h));
}
还有输出,
h
e
l
l
o
h
a
i
h
e
l
l
o
h
a
i
h
i
如今的编译器非常聪明,它们可能只会发出警告而不是失败,即
main.c:14:13: warning: initialization from incompatible pointer type [enabled by default]
char **x = array;
至此,我们应该可以理解双指针不是双数组了。
第一个h 来自hello,第二个i 来自hai。注意距离是 8 个字节,等于 指针的大小。
另外,我们也可以,
char *y[2];
for (h = 0; h < 2; h++)
y[h] = array[h];
for (h = 0; h < 2; h++)
printf("%s\n", y[h]);
for (h = 0; h < 2; h++)
for (i = 0; i < 6; i++)
printf("%c\n", *(*(p+h) + i));
但是这个赋值不是一行语句。
还有输出,
hello
hai
h
e
l
l
o
h
a
i