sizeof 函数

sizeof函数

使用:
void main()
{
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变量

问题解析:

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语言为强类型,强转改变不了自身的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值