今天发现一个关于二级指针的内存占用问题:**a[3][4],(**a)[3][4], *(*a)[3][4], *(*a[3])[4]等变量占用的内存字节大小。自己在VS2010 win32平台上运行了一下,看到了有趣的答案,然后百度了一下,发现答案错的不少,也许是控制台不一样。下面是代码片段和运行结果:
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
double **a1[3][4];
double (**a2)[3][4];
double *(*a3)[3][4];
double *(*a4[3])[4];
double *(**a5[2][3])[4];
cout <<sizeof(a1) << endl<<sizeof(a2) << endl<<sizeof(a3) << endl<<sizeof(a4) << endl<<sizeof(a5)<< endl;
return 0;
}
解释原因如下:
在32位平台下,指针占用内存的大小为4个字节,然后查了一下,()和[]的优先级一样,结合性是从左到右,都比*优先级高。就例子中变量a1-a5中()在左,优先级先于[],所以,最终指针的个数为()中指针的个数。如,变量a1,[]优先级高于*,所以最后的指针个数为3*4=12,内存占用为:12*4=48;变量a2和a3中()中的指针个数为1,所以最后的内存占用为:1*4=4;变量a4中()中的指针个数为3个,所以最后的内存占用为:3*4=12;同理a5为:2*3*4 = 24。