Sizeof是c/c++中的关键字,它是一个运算符,其作用是取得一个对象(数据类型或数据对象)的长度(即占用内存的大小,以byte为单位)。其中类型包括基本数据类型(不包括void)、用户自定义类型(结构体、类)、函数类型。数据对象是指用前面提到的类型定义的普通变量和指针变量(包含void指针)。 十大特性: 特性0:sizeof是运算符,不是函数; 特性1:sizeof不能求void类型的长度; 特性2:sizeof能求void类型的指针的长度; 其实指针也是变量,只不过这个变量很特殊,它是存放其它变量地址的变量,目前32位计算机平台下的指针变量的大小为4 特性3:sizeof能求得静态分配内存的数组的长度; 注意:用sizeof求字符串的长度时要加上末尾的‘/0’ 例: void fun(int array[10]) { int n = sizeof(array); } 编辑程序: #include<iostream> using namespace std; int fun(int array[10]) { int n = sizeof(array); return n; } int main() { int ret; int array[10] = { 0 }; ret = fun(array); cout <<ret<< endl; system("pause"); return 0; } 运行结果: 4 请按任意键继续. . . 在fun类n的值为4,而不是40,这是因为在函数参数传递时,数组被转化成指针了,假如直接传递整个数组的话,那么必然涉及到数组元素的拷贝(实参到形参的拷贝),当数组非常大时,会导致函数执行效率极低,而只传递数组的地址(即指针),只需要拷贝4byte。 特性4:sizeof不能求动态分配的内存的大小; 特性5:sizeof不能对不完整的数组求长度,否则会编译出错; 特性6:当表达式作为sizeof的操作数时,它返回的是表达式计算结果的类型大小,但是它不对表达式求值; 例:程序: #include<iostream> using namespace std; int main() { char ch = 1; int num = 1; int n1 = sizeof(ch + num); int n2 = sizeof(ch=ch + num); cout <<"n1="<<n1<< endl; cout <<"n2=" << n2 << endl; system("pause"); return 0; } 结果: n1=4 n2=1 请按任意键继续. . . 由于默认类型转换的原因,表达式ch + num的计算结果类型为int,因此n1=4;而ch=ch + num的计算结果为char,虽然在计算ch + num时结果为int,当把结果赋给ch时又进行了类型转换,因此表达式的最终类型还是char,故n2=1。 特性7:sizeof可以对函数调用求大小,并且求得的大小等于返回类型(函数类型)的大小,但是不执行函数体; 特性8:sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和; 规则: a.结构体的大小等于结构体内最大成员大小的整数倍 b.结构体内的成员的首地址相对于结构体的首地址的偏移量是其类型的整数倍,比如说double型成员相对于结构体的首地址的地址偏移量应该是8的倍数 c.为了满足规则1和2,编译器会在结构体成员之后进行字节填充 例:程序: #include<iostream> using namespace std; int main() { struct A { int num1=0; int num2=0; double num3=0; }; struct B { int n1=0; double n2=0; int n3=0; }; cout <<"A="<<sizeof(A)<< endl; cout << "B="<< sizeof(B)<< endl; system("pause"); return 0; } 结果: A=16 B=24 请按任意键继续. . . sizeof(A):4+4+8=16 sizeof(B):4(n1占用地址空间:0,1,2,3)+4(不够8的倍数填充4个地址空间,4,5,6,7)+8(n2占用地址空间:8-15)+4(n3占用地址空间:16-19)+4(不够8的倍数填充4个,20,21,22,23)=24。 特性9:sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小。
时间: 2024-12-28 17:17:11