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是这种类型对象的总字节数,并包括任何垫补在内。