初识sizeof运算符

sizeof运算符以字节为单位返回操作数的大小。操作数可以是一个数据对象或一个数据类型。当操作数是类型时,则必须被放在圆括号里;当操作数是表达式时,则按表达式求值的类型计算。语法如下:

int a;
sizeof a;       // 操作数是一个数据对象,可以不使用括号。
sizeof(a);      // 等同于上面的语法
sizeof(char);   // 操作数是一个类型
sizeof(a + 3)   // 操作数是一个表达式,最终按(a+3)的结果类型int计量。

sizeof可以接受多种表达方式,但它的本质其实是测量实例化某一类型所需的字节数。这就是说:

还有一些注意点:

  1. sizeof是运算符而不是函数。
  2. sizeof是编译期行为,它在编译期间就可以推导出类型的大小,而不需要对表达式求值。
  3. sizeof的操作数部分,不论是变量、类型或者表达式,最终测量的是实例化某一类型所需的字节数。

因此测试一个int变量与测试int类型自身得到的结果是一致的。下面的示例程序展示了在32位环境下sizeof的多种表现。

ZYF

#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;
}

glimix.com

测量数组

应用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;
}

glimix.com

数组a包含9个int元素,sizeof(a) = sizeof(int) * 9 = 36字节。知道数组对象的总大小,除以元素的类型,便可以得到元素个数:

这两种方法都是可行的,第二种方式的优势在于,改变数组类型时不需要修改代码;此外,这里我们使用数组的第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;
}

glimix.com

ZYF

练习

1 使用sizeof()测试一个字面量'c'的大小。

2 说说看,sizeof(9, 2.0)测量的结果是多少。

陕ICP备2025078817号-1 陕公网安备61011202001108号