sizeof特点

sizeof是C语言的一种单目操作符不是函数。作用是以字节的形式给出了其操作数的储存大小。
eg:++,--都是单目操作符

sizeof使用形式:

sizeof (type)
type a; 
sizeof (a);
sizeof a;
sizeof int;//err

sizeof不能用于函数类型和位置储存大小的数据类型,eg:位置储存大小的数组类型,位置内容的结构体或者联合类型,void类型;

sizeof不用类型操作数的结果

  1. 若操作数具有类型char,unsigned char 或signed char,其结果等于1.
  2. int ,unsigned int ,short int,unsigned short,long int ,unsigned long,float,double,long double类型的sizeof,大小依赖于具体的实现,一般可能是2,2,2,2,4,4,4,8,10.
  3. 当操作数是指针时,sizeof依赖于编译器。不同的编译器结果不一样。
  4. 当操作数是数组时,结果是整个数组的总字节数。
char a[]="hahahaha”;
sizeof(a)=8;
int  a[10];
sizeof(a)=40;
  1. sizeof应用于结构体的情况
struct  M
{double  a;
char c;
int d;
};

在VC中sizeof(M)=16;
因为VC根据成员变量的出现的顺序和对齐方式进行计算
计算如下:

sizeof(double)=8;//是char的整数倍
char (c) =1;//这时所有的空间大小为9不是int 的倍数,为了满足对齐原则系统自动补3个空间
sizeof(int )= 4;
sizeof(M)=sizeof(double) + sizeof(char) + 3 +sizeof(int) = 16;

6.如果操作数是函数中的形参,sizeof给出其指针的大小。

注意:数组做形参时,数组名称被当作指针使用
void ha(int a[])
sizeof(a)=4;

与strlen()比较

strlen计算字符数组的字符数,以“/0”未结束符,不计算”/0“为数组元素
sizeof是计算所占空间的大小,所以计算”/0“

注意:平时在计算长度时如果变量长度可变,可以用sizeof进行计算

经典题

double* (*a)[1][2];
sizeof(a)=4;//a为指针;
sizeof(a)=8;//*a为一个double[1][2]的多维数组类型,所以sizeof(a)=1*2*sizeof(double)=8
sizeof(*a)=8//**a表示一个double[6]类型的数组,所以sizeof(*a)=6*sizeof(double)=8
sizeof(**a)=4//***a表示其中的一个元素,也就是double。所以sizeof(***a)=4
sizeof(****a)=8;//****a是一个double,所以sizeof(****a)=sizeof(double)=8

猜你喜欢

转载自blog.csdn.net/qq_39032310/article/details/79822139