1 cout << sizeof(*a) << endl;//1
2 cout << sizeof(*b) << endl;//1
3 cout << sizeof(*c) << endl;//4
4 cout << sizeof(*d) << endl;//3
特别如果字符数组表示字符串的话,数组末自动插入的'\0',在sizeof时不能遗漏
数组a的大小在定义时未指定,编译时给它分配的空间是按照初始化的值确定的,也就是7。c是多维数组,占用的空间大小是各维数的乘积,也就是6。可以看出,数组的大小就是他在编译时被分配的空间,也就是各维数的乘积*数组元素的大小。
结论:数组的大小是各维数的乘积*数组元素的大小。
这里有一个陷阱:
1 int *d = new int[10];
2
3 cout<<sizeof(d)<<endl; // 4
4
d是我们常说的动态数组,但是他实质上还是一个指针,所以sizeof(d)的值是4。
再分析下面的多维数组问题:
1 double* (*a)[3][6];
2
3 cout<<sizeof(a)<<endl; // 4
4 cout<<sizeof(*a)<<endl; // 72
5 cout<<sizeof(**a)<<endl; // 24
6 cout<<sizeof(***a)<<endl; // 4
7 cout<<sizeof(****a)<<endl; // 8
很费解的多维数组定义,改用typedef定义如下:
1 typedef (double *) ArrType [3][6];
2 ArrType * a;
现在是不是很清晰了?(关于typedef用法的探讨,请见文章)
1 typedef (double *) ArrType [3][6];
2 ArrType * a;
3
4 cout << sizeof(a) << endl;//4
5 cout << sizeof(*a) << endl;// double * [3][6] : 3*6*sizeof(double *) = 72
6 cout << sizeof(**a) << endl;// double * [6] : 6*sizeof(double *) = 24
7 cout << sizeof(***a) << endl;// sizeof(double *) = 4
8 cout << sizeof(****a) << endl;// sizeof(double) = 8
a是一个很奇怪的定义,他表示一个指向 double*[3][6]类型数组的指针,此3×6数组中存储的是指向double的指针。既然是指针,所以sizeof(a)就是4
既然a是指向double*[3][6]类型的指针:
*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*sizeof(double*)=72。
**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*sizeof(double*)=24。
***a就表示其中的第一个元素,也就是double*了,所以sizeof(***a)=4。
****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8