C编程从入门到实践
上QQ阅读APP看书,第一时间看更新

5.7 求字节数的运算符

知识点讲解:视频\第5章\求字节数运算符详解.mp4

C语言中求字节数的运算符是sizeof,其功能是计算数据类型所占的字节数。sizeof将以字节形式给出操作数的大小。操作数可以是一个表达式或括号内的类型名。sizeof可以处理数据类型,使用格式如下。

    sizeof(type)

其中,“type”是数据类型,它必须包含在括号内。sizeof也可以用于变量,其使用格式为下面中的一种:

    sizeof  (var_name)
    sizeof  var_name

在C语言中,求字节数的运算符sizeof主要有两个用途。

❑ 和存储分配或I/O系统等例程进行通信。例如下面的代码。

    void * malloc(size_t size),
    size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream)

❑ 计算数组中元素个数。例如下面的代码。

    void * memset(void * s, int c, sizeof(s))

在此需要注意的是,sizeof运算符不能用于函数类型、不完全类型或位字段。不完全类型指的是具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。因为sizeof可以用于数据类型,所以可以通过“sizeof(type)”来获取各个类型在内存中占用的存储单元。

实例5-8

在当前系统中获取各基本数据类型在内存中占用的空间

源码路径daima\5\5-8

本实例的实现文件为“sizeof.c”,具体实现代码如下。

    #include <stdio.h>
      int main(void){
        //开始显示整型数据在内存中的字节数
        printf("An int is %d bytes\n", sizeof(int));
        printf("A short is %d bytes\n", sizeof(short));
        printf("A long is %d bytes\n", sizeof(long));
        printf("An unsigned int is %d bytes\n", sizeof
(unsigned int));
        printf("An unsigned short is %d bytes\n", si
zeof(unsigned short));
        printf("An unsigned long is %d bytes\n\n", s
izeof(unsigned long));
        //显示实型数据在内存中的字节数
        printf("A float is %d bytes\n", sizeof(float));
        printf("A double is %d bytes\n\n", sizeof(double));
        //显示字符型数据在内存中的字节数
        printf("A char is %d bytes\n", sizeof(char));
        printf("An unsigned char is %d bytes\n", sizeof(unsigned char));
    }

拓展范例及视频二维码

范例5-8-01:使用sizeof运算符和取值运算符

源码路径:演练范例\5-8-01\

范例5-8-02:演示类型的强制转换

源码路径:演练范例\5-8-02\

运行上述代码后将输出逗号表达式的运算结果,如图5-8所示。

sizeof运算符的结果类型是size_t,在头文件stddef.h中typedef为无符号整型。使用该类型的目的是确保能容纳所创建的最大对象。sizeof的处理结果如下所示。

(1)若操作数的类型为字符型、无符号字符型或有符号字符型,则其结果等于1, ANSI C正式规定字符类型占用1字节。

(2)整型、无符号整型、短整型、无符号短型、长整型、无符号长型、单精度型双精度型、长双精度型的sizeof在ANSI C中没有具体规定,其大小依赖于实现,一般分别为2、2、2、2、4、4、4、8、10字节。

图5-8 执行效果

(3)当操作数是指针时,sizeof依赖于编译器。例如在Microsoft C/C++7.0中,near类指针的字节数为2,far、huge类指针的字节数为4。一般UNIX的指针字节数为4。

(4)当操作数为数组类型时,其结果是数组的总字节数。

(5)联合类型操作数的sizeof是具有最大字节成员的字节数。结构类型操作数的sizeof是这种类型对象的总字节数,并包括任何垫补在内。