sizeof()运算符

文章详细解析了C语言中sizeof运算符的用法,包括对浮点数、字符、字符串、数组以及指针的处理。在64位系统下,展示了sizeof计算不同类型数据的大小,如double是8字节,float是4字节,字符在运算时提升为int类型等。同时,文章对比了sizeof与strlen的区别,前者计算内存占用,后者计算字符串长度至为止。
摘要由CSDN通过智能技术生成

计算常量大小

如下代码:

printf("%lu\n%lu\n%lu\n%lu\n%lu\n", sizeof(1.0), sizeof(5.20f), sizeof('g'), sizeof("abcdef"), sizeof("abcdef\0\0")); 

结果为:(64位系统下)

8
4
4
7
9

1.0为double型浮点数,5.20f为float型浮点数,所以结果分别为8、4
'g'为字符型,但是在运算时会进行整型提升提升至int类型,所以计算结果是4
"abcdef"为字符串,传入运算符中的是字符串地址,可以看做为字符数组,所以计算结果为数组的长度即为7
sizeof()在计算常量字符串的大小时,无论字符串中有多少\0,都会计算其大小,并在最后默认存在一个隐藏的结束符'\0',无论这个结束符前有多少'\0'。 

计算表达式大小
 

char a = 2;
char b = 5;
char c = 0;
printf("%d\n%d\n%d\n",sizeof(a+b), sizeof(c=a+b), c);

结果为
4
1
0

         a和b在计算的时候都会整型提升,转换为int类型,所以为4
        c=a+b 在a+b整型提升之后,在赋值给c的时候又会发生截断,变为char类型,但是没有完成赋值的操作,c不会被赋值,所以c=a+b的大小为1。
        因为在sizeof()运算符中c没有进行计算,所以c的值依然为0。

计算数组大小

   int arr[10] = {0};
   printf("%lu\n",sizeof(arr));
   printf("%lu\n",sizeof(&arr));
   printf("%lu\n",sizeof(arr[0]));
   printf("%lu\n",sizeof(arr+1));
   printf("%lu\n",sizeof(&arr+1));
   printf("%lu\n",sizeof(*&arr));
   printf("%lu\n",sizeof(&*arr));

结果为:(64位系统下)

40
8
4
8
8
40
8

 sizeof(数组名)的结果为计算整个数组的大小,所以结果为4*10为40
&arr为整个数组的地址,计算地址大小即为指针的大小,所以结果为4或者8
arr[0]为数组的第一个元素,计算这个元素的大小,所以结果为4
arr+1为数组的第二个元素的地址,算地址大小即为指针的大小,所以结果为4或者8
&arr+1为数组之后的数组指针,,所以结果为4或者8
*&arr可视作arr,所以计算的是整个数组的大小
&*arr可视作&arr[0],为数组的第二个元素的地址,算地址大小即为指针的大小,所以结果为4或者8

sizeof()运算符与strlen函数

sizeof()与strlen的区别是,sizeof()计算的是所占内存的大小而strlen计算的是字符串'\0'前的字符长度
计算字符指针的大小
     

    char* p = "abcdef";
    printf("%lu\n",sizeof(p));//p为指针,结果为指针大小
    printf("%lu\n",sizeof(p+1));//同上
    printf("%lu\n",sizeof(*p));   //解引用后为字符,结果为字符大小    
    printf("%lu\n",sizeof(p[0]));//一样是解引用,同上
    printf("%lu\n",sizeof(&p));//指针p在内存中的地址,取指针的地址也是指针变量,结果为指针的大小
    printf("%lu\n",sizeof(&p+1));//为跳过p后的地址,同上,指针加减操作后还是指针
    printf("%lu\n",sizeof(&p[0]+1));和第二行的结果一样
    printf("\n");
    printf("%lu\n",strlen(p));    //函数计算字符串'\0'前的长度,为6
    printf("%lu\n",strlen(p+1));//p+1则从第二个字符开始计算字符串长度
    printf("%lu\n",strlen(*p));//传入一个字符,函数中会对其解引用,报错
    printf("%lu\n",strlen(p[0]));//同上
    printf("%lu\n",strlen(&p));//指针的指针无法计算其'\0'前的长度
    printf("%lu\n",strlen(&p+1));//同上
    printf("%lu\n",strlen(&p[0]+1));//和第二行的结果一样

结果为(64位系统下):
8
8
1
1
8
8
8

6
5
//段错误
//段错误
随机值
随机值
5

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值