初识sizeof运算符
sizeof运算符以字节为单位返回操作数的大小。操作数可以是一个数据对象或一个数据类型。当操作数是类型时,则必须被放在圆括号里;当操作数是表达式时,则按表达式求值的类型计算。语法如下:
- sizeof 数据对象
- sizeof(数据对象)
- sizeof(类型)
int a;
sizeof a; // 操作数是一个数据对象,可以不使用括号。
sizeof(a); // 等同于上面的语法
sizeof(char); // 操作数是一个类型
sizeof(a + 3) // 操作数是一个表达式,最终按(a+3)的结果类型int计量。
sizeof可以接受多种表达方式,但它的本质其实是测量实例化某一类型所需的字节数。这就是说:
- 操作数是类型,那么sizeof获取此类型的大小。
- 操作数是变量,那么sizeof获取此变量的类型的大小。
还有一些注意点:
- sizeof是运算符而不是函数。
- sizeof是编译期行为,它在编译期间就可以推导出类型的大小,而不需要对表达式求值。
- sizeof的操作数部分,不论是变量、类型或者表达式,最终测量的是实例化某一类型所需的字节数。
因此测试一个int变量与测试int类型自身得到的结果是一致的。下面的示例程序展示了在32位环境下sizeof的多种表现。
#include <stdio.h>
int main()
{
printf("sizeof(char) = %d byte\n", sizeof(char));
printf("sizeof(int) = %d bytes\n", sizeof(int));
printf("sizeof(double) = %d bytes\n\n", sizeof(double));
int a = 1024;
printf("sizeof a = %d bytes\n", sizeof a);
printf("sizeof(a) = %d bytes\n", sizeof(a));
printf("sizeof(++a) = %d bytes\n", sizeof(++a));
printf("sizeof(a+3.0) = %d bytes\n\n", sizeof(a + 3.0));
printf("a = %d\n", a);
return 0;
}

- 由于sizeof是编译期行为,sizeof(++a) 并不会执行++a操作,所以a的最终结果仍为1024。
- 对于sizeof(a+3.0),a是int,3.0的类型是double, 整个表达式求值后类型是double,因此这与测试sizeof(double)无异。
测量数组
应用sizeof到数组类型时,将计算出整个数组元素所占用的字节数。
#include <stdio.h>
int main()
{
int a[] = {1, 9, 7, 6, 2, 5, 5, 4, 7};
char c[] = {'x', 'y', 'z', 'w', 'f'};
printf("sizeof(a) = %d bytes\n", sizeof(a));
printf("sizeof(c) = %d bytes\n\n", sizeof(c));
printf("count a[] = %d\n", sizeof(a) / sizeof(int));
printf("count c[] = %d\n", sizeof(c) / sizeof(c[0]));
return 0;
}

数组a包含9个int元素,sizeof(a) = sizeof(int) * 9 = 36字节。知道数组对象的总大小,除以元素的类型,便可以得到元素个数:
- 对于数组a,我们使用表达式:
sizeof(a) / sizeof(int) - 对于数组c,我们使用表达式:
sizeof(c) / sizeof(c[0])
这两种方法都是可行的,第二种方式的优势在于,改变数组类型时不需要修改代码;此外,这里我们使用数组的第1个元素 sizeof(c[0]) 进行测试,想想看,使用其它元素,如c[1]可行吗?会有什么风险吗?
数组的类型
我们找到了变量与其类型间的一个sizeof对等关系 ,即:sizeof(变量名) == sizeof(对应变量的类型),那数组呢?为此,我们得先找到找到数组的类型表示法,即填充在sizeof()中的数组变量的类型。让我们从语法的角度来推导看看,首先列出定义变量与数组的语法。
类型 变量名;
类型 数组名[数组大小];
接着定义一组对应的变量:
int a;
int arr[9];
然后移除掉变量名:
int
int [9]
这时类型已经光秃秃的显示出来了,所以数组arr的类型就是:int[9],也可以写成 int [9],看习惯。
#include <stdio.h>
int main()
{
int a[9];
char c[5];
double d[7];
printf("sizeof(a) = %d bytes\n", sizeof(a));
printf("sizeof(c) = %d bytes\n", sizeof(c));
printf("sizeof(d) = %d bytes\n\n", sizeof(d));
printf("sizeof(int[9]) = %d bytes\n", sizeof(int[9]));
printf("sizeof(char[5]) = %d bytes\n", sizeof(char[5]));
printf("sizeof(double[7]) = %d bytes\n\n", sizeof(double[7]));
return 0;
}

练习
1 使用sizeof()测试一个字面量'c'的大小。
2 说说看,sizeof(9, 2.0)测量的结果是多少。
陕公网安备61011202001108号