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语言平时给人的裸露感(实际上也是我的水平不够高)有一定的相悖,这种相悖给人一种别扭的感觉。