Sizeof是C/C++中的关键字,它是一个运算符,其作用是取得一个数据类型{基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型}或者数据对象的byte长度。
特性1:sizeof不能求得void类型的长度。
特性2:sizeof能求得void类型的指针的长度。对任何类型的指针变量进行sizeof运算其结果就是4。
特性3:sizeof能求得静态分配内存的数组的长度。
Int a[10]; int n = sizeof(a);则结果为40;
char ch[]=”abcde”;sizeof(ch);结果为6,注意字符串数组末尾有’\0’;
void fun(int array[10]) {int n = sizeof(array);} 结果为4。不管形参是int的型数组,还是其他任何用户自定义类型的数组,这里的n都是4,原因是在函数参数传递时,数组被转化成指针了。
特性4:sizeof不能求得动态分配的内存的大小。int*a = new int[10];int n = sizeof(a);n等于4,因为a是指针,切记这里的a与特性3中的a并不一样!
特性5:sizeof不能对不完整的数组求长度!
file1.cpp中有如下的定义:int arrayA[10] = {1,2,3,4,5,6,7,8,9,10};int arrayB[10] = {11,12,13,14,15,16,17,18,19,20};
file2.cpp包含如下几个语句: externarrayA[];externarrayB[10];cout<<sizeof(arrayA)<<endl;/*编译出错!!*/cout<<sizeof(arrayB)<<endl;
sizeof(arrayA)试图求不完整数组的大小,声明:extern int arrayA[]只是告诉编译器arrayA是一个整型数组,但是并没告诉编译器它包含多少个元素,因此对file2.cpp中的sizeof来说它无法求出arrayA的大小,所以编译器干脆不让你通过编译。
特性6:当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!
char ch = 1; int num=1; int n1 =sizeof(ch+num); int n2 = sizeof(ch =ch+num);//n1等于4,n2等于1,ch等于1
特性7:sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体
特性8:sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!涉及字节对齐