sizeof函数
使用:
void main()
{
int a=10;
int x=sizeof(a); //正确
x=sizeof(int); //正确
x=sizeof a; //正确
sizeof int; //错误
}
{
int a=10;
int x=sizeof(a); //正确
x=sizeof(int); //正确
x=sizeof a; //正确
sizeof int; //错误
}
1.与strlen()比较
strlen: 计算字符数组的字符数,以“\0”为结束判断,不计算‘\0’。
sizeof: 计算数据(包括数组 变量 类型 结构体等)所占内存空间,用字节数表示
(注意:sizeof用在字符数组计算'\0'的大小)
2.静态数组sizeof与指针比较
指针均可视为变量类型的一种。
所有指针变量的sizeof的操作结果均为4
例1.
char *p;
sizeof ( p)=4;
sizeof (*p)=1; //相当于sizeof(char);
对于静态数组,sizeof可直接计算数组大小
例2.
int a[10];
char b[ ]='hello';
sizeof(a)=4*10=40;
sizeof(b)=1*6=6;
数组做形参时,数组名称当指针使用!
例3.
void fun(char p[ ] )
{
sizeof (p); //sizeof(p)=4
}
3.使用sizeof时string的注意事项
string s='hello';
sizeof(s)=string类的大小=32
sizeof(s.c-str())得到字符串长度=4
经典考题
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变量
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变量
问题解析:
1.a表示一个指向double*[3][6]类型数组的指针,既然是指针,则sizeof(a)=4
2.a是执行double*[3][6]类型的指针,*a则表示一个double*[3][6]的多维数组类型,因此
sizeof(*a)=3*6*sizeof(double*)=72
3.**a表示一个double*[6]类型的数组,则sizeof(**a)=sizeof(double*)=24
4.***a表示其中的一个元素,也就是double*,则sizeof(***a)=4
5.****a,是一个double,所以sizeof(****a)=sizeof(double)=8
4.sizeof()函数---unsigned
void main()
{
for (inta=-4,a<sizeof(int),a++)
{printf("%d\n",a);
}
}
===>无输出结果
因为sizeof为无符号,int+unsigned=>unsigned
-4==>1111 1111 1111 1111 1111 1111 1111 1100==>unsigned为一个大数
so,无结果
补充:
(bool+char+short)+int=>int
int+unsigned=>unsigned
unsigned+double,float=>double
void main()
{
char c=128;
unsigned char uc=128;
unsigned short us=0;
us=c+uc;
//c=>1000 0000 //1111 1111 1111 1111 1111 1111 1000 0000
//us=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
printf("%x\n",us);//0x0000
us=(unsigned char)c+uc;
//c'=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
//us=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
printf("%x\n",us);//0x0100
us=c+(char)uc;
//c=>1000 0000 //1111 1111 1111 1111 1111 1111 1000 0000
//uc'=>1000 0000//1111 1111 1111 1111 1111 1111 1000 0000
printf("%x\n",us);//0xff00
字节扩展:
1.有符号位扩充符号位。
2.无符号扩充0。
c语言为强类型,强转改变不了自身的类型
int+unsigned=>unsigned
unsigned+double,float=>double
void main()
{
char c=128;
unsigned char uc=128;
unsigned short us=0;
us=c+uc;
//c=>1000 0000 //1111 1111 1111 1111 1111 1111 1000 0000
//us=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
printf("%x\n",us);//0x0000
us=(unsigned char)c+uc;
//c'=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
//us=>1000 0000 //0000 0000 0000 0000 0000 0000 1000 0000
printf("%x\n",us);//0x0100
us=c+(char)uc;
//c=>1000 0000 //1111 1111 1111 1111 1111 1111 1000 0000
//uc'=>1000 0000//1111 1111 1111 1111 1111 1111 1000 0000
printf("%x\n",us);//0xff00
字节扩展:
1.有符号位扩充符号位。
2.无符号扩充0。
c语言为强类型,强转改变不了自身的类型