【C语言】sizeof运算符 讲解与例题

介绍

sizeof运算符允许程序获取存储指定类型的值所需要的内存空间。表达式sizeof(类型名)的值是一个无符号整数,代表的是存储属于该类型的值所需要的字节数。如,sizeof(char)的值为1。

但其实对于其他许多类型我们无法得到一个确切的值而是取决于具体实现。如在32位的机器上,sizeof(int)的值为4。

注意,sizeof是一种特殊的运算符,因为编译器本身就能确定sizeof表达式的值

当然,除了类型之外,sizeof也可以用来求常量、变量和表达式的字节数。假设i和j为整型变量,sizeof(i)在32位机器上的值就为4,这和表达式sizeof(i+j)的值是一样的。

需要注意的一点就是圆括号的使用,编译器会把表达式sizeof i+j解释为(sizeof i)+j,因为sizeof是一元运算符,优先级高于二元运算符+。为了防止在无意间犯下这种错误,我们最好在写sizeof i的时候还是把它写为sizeof(i)。

sizeof表达式的类型是size_t,这是一种由实现定义的类型,能确定的是它是一个无符号整型。这一点在定义一个sizeof表达式时要记住,别误写成int之类的其他类型。

运用场景

初学C语言,关于sizeof我们可能会用于这几个场景:

显示类型的大小:
printf("Size of int:%zd\n", sizeof(int));//显示int类型在当前实现下的大小

 

求数组的元素个数:

我们可以用sizeof求得数组的大小(单位是字节),也可以用sizeof求得数组每个元素的大小(单位是字节),然后用数组大小除单个元素大小就可以得到数组的元素个数。

其中第二个场景可以说是常用的了。 

 

几道有关sizeof的题目

来看几道sizeof相关的题目吧。

1.下面这个代码的结果是什么呢?

#include <stdio.h>
int main()
{
    int arr[] = {1,2,(3,4),5};
    printf("%zd\n", sizeof(arr));
    return 0;
}

分析:我们知道,这个数组里每个元素是整型,所以元素个数*4就是这个数组的大小。那么重点是,这里有几个元素呢?其实这题主要考察的在于(),即逗号表达式。(3,4)为逗号表达式,取后者,所以数组中元素分别为:1,2,4,5,四个元素。所以这题的结果是16。

2.下面哪个选项是正确的呢?

char acX[] = "abcdefg";
char acY[] = { 'a','b','c','d','e','f','g'};

A. 数组acX和数组acY等价

B. 数组acX和数组acY的长度相同

C. sizeof(acX)>sizeof (acY)

D. strlen (acX)>strlen (acY)

分析:这题的关键在于理解char acX[] = "abcdefg";和char acY[] = { 'a','b','c','d','e','f','g'};的区别,而这一点的理解在C语言的学习中是非常重要的。都是定义一个字符数组,但前者的初始化用的是字符串,后者的初始化则是一个个字符。这两者的区别在于前者末尾隐藏了一个'\0',而这个'\0'是会放入数组中的,而后者由于是一个个字符初始化的,就没有隐藏的'\0',数组中放的就是这几个字符。

所以前者,有'\0'的数组自然是大一点,sizeof求的是字节数,'\0'也是一个字符,占1个字节,所以sizeof(acX)>sizeof (acY)。至于strlen是计算'\0'之前的字符个数,后者都没有'\0',所以会得到一个随机值,而前者就是确定的7。

3.下面这个代码的结果是什么?

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}

分析:我们知道sizeof(i)就是4(一般情况),i此时是一个全局变量,全局变量,没有给初始值时,编译其会默认将其初始化为0。那么i--就是-1,-1<4,应该输出'<'。但是正确答案却是'>',为什么呢?

sizeof的返回值类型实际为无符号整形,因此编译器会将左侧的i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8。

4.sizeof是在编译器工作的哪个时期运算的?

下面这个代码为什么不输出3?

int a = 2;
sizeof(++a);
printf("%d", a);//输出结果为2

分析:因为sizeof是运算符,编译时期就确定了sizeof(++a)的结果,sizeof()中的表达式是不执行的。程序运行的过程是先编译再运行的,所以就没有真正++a,a的结果就还是2。

关于sizeof运算符的讲解与例题就到此为止了,希望大家看得开心。

  • 28
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值