1.sizeof是一种操作符,对变量或者对象可以不加括号,但是类型,必须加括号;
2.指针与数组sizeof()使用:
(1) 指针也属于一种变量类型(32位操作系统下是4字节,64位操作系统是8字节):
例1:char *p;
int length1=sizeof(p) ; // length1=4 或 length1=8;
int length2=sizeof(*p ) // length2=1;
(2)对于数组,sizeof 可以直接计算数组大小,包括结束符'\0':
例2: int a[10];
char b[ ]="hello";
int length1=sizeof(a) // length1=40;
int length2=sizeof(b) // length2=6;
(3)在函数传递参数中,数组作形参时,数组名称当作指针使用
void fun( char a[ ])
{
length=sizeof(a); // length=4 或 length=8
}
3.与strlen()比较
(1)strlen只能计算字符数组的字符数,不包含'\0';
(2)sizeof()计算数据(包括数组,变量,类型,结构体等)所占的空间,用字节数表示(包含'\0')
4.sizeof() 与string的注意事项
string s="hello";
sizeof(s) //等于string类型大小4,可以使用 s.size() ,该长度与库实现有关,与存放的字符串无关,是某个固定的值
5.union 与 struct 的空间计算
(1)union 用sizeof()测总大小是最大类型的字节大小;
(2)struct 用sizeof()测总大小应遵循两个原则:
a,总空间是占用空间最大的类型成员所占字节的整数倍;
b,数据对齐原则:数据在内存中按照结构构成成员先后顺序进行排序,当排到该成员的时候,其前面的已摆放空间大 小必须是该成员类型大小的整数倍,否则需要补齐;
6.sizeof不支持链式表达式,在预编译期间处理。
int a = 0;
cout<<sizeof(a=3)<<endl; // 输出为4,编译期间替换为 cout<<4<<endl;
cout<<a<<endl; // 输出为0,并不是3,编译期间替换为 cout<<a<<endl;
7.经典例子:
double* (*a)[3][6]; //假如指针使用4个字节存储
sizeof(a); //a为指针, 4
sizeof(*a); // *a 为一个有3 * 6个指针元素的数组 ,72
sizeof(**a); // **a为有 6个指针类型的一维数组元素 ,24
sizeof(***a); //***a 为一个指针类型的数组元素 , 4
sizeof(****a): //****a 为一个double 类型的变量 , 8