C语言中多维数组和多重指针的区别

比如下面这段代码:

char str[3][3] = {"aa","bb","cc"};
char** p = str;
char* s1 = str[0];
char* s2 = p[0];

有什么问题?
我们来看实际的内存布局,str是一个多维数组,它的尺寸实际上是3*3=9个char。
也就是一共8bit * 9 = 72bit,而在一台64位机器上,一个char*的大小就是64位,
所以对于char* s1 = str[0]s1的实际大小(使用printf("%p")打印可以得到)是跟str本身一样的,而对于char* s2 = p[0]s2的实际大小会是0x6363006262006161,即把"aa\0bb\0cc"取了出来当作指针。
这个问题关键的地方在于:这种多维数组和多重指针的不同之处是直接由C语言标准支持、编译器加以实现的,而这种不同之处与C语言平时给人的裸露感有一定的相悖,这种相悖给人一种别扭的感觉。

posted on 2024-05-18 18:12  火焰龙卷风  阅读(3)  评论(0编辑  收藏  举报

导航