参考:sizeof_百度百科
sizeof()用法汇总(经典)
声明:本文是笔者抽出对自己有用的细节,对前两文的总结。
1、sizeof概念
sizeof是C语言中判断数据类型或者表达式长度符;不是一个函数,它的计算在程序编译时进行,而不是在程序执行的过程中才计算出来。所有sizeof()在编程过程中可以看做是一个常数来处理。
2、与strlen()比较
strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素
sizeof计算数据(变量、类型、结构体等)所占内存空间,用字节数表示
char s[] = "hello";
运行结果
cout<<sizeof(s)<<endl; //6
cout<<strlen(s)<<endl; //5
3、格式
sizeof有三种语法形式,如下:
1) sizeof( object ); // sizeof( 对象 );
2) sizeof( type_name ); // type_name( 类型 );
3) sizeof object; // sizeof 对象;
4、返回值
其返回值类型为size_t,在头文件“stddef.h”中定义。这是一个依赖于编译系统的值,一般定义为
typedef unsigned int size_t;
5、经典问题
double* (*a)[3][6];
cout<<sizeof(a)<<endl; // 4 “a为指针”
cout<<sizeof(*a)<<endl; // 72 “*a为一个有3*6个指针元素的数组”
cout<<sizeof(**a)<<endl; // 24 “**a为数组一维的6个指针”
cout<<sizeof(***a)<<endl; // 4 “***a为一维的第一个指针”
cout<<sizeof(****a)<<endl; // 8 “****a为一个double变量”
问题解析:
a是一个很奇怪的定义,他表示一个指向double*[3][6]类型数组的指针。既然是指针,所以sizeof(a)就是4。既然a是执行double*[3][6]类型的指针,*a就表示一个double*[3][6]的多维数组类型,因此sizeof(*a)=3*6*4=72。同样的,**a表示一个double*[6]类型的数组,所以sizeof(**a)=6*4=24。***a就表示其中的一个元素,也就是double*了,所以sizeof(***a)=4。至于****a,就是一个double了,所以sizeof(****a)=sizeof(double)=8。