C语言中的sizeof 操作符

简介:

今天在读《c专家编程》的时候看到第38页里面说到“当sizeof的操作数是类型名时,两边必须加上括号(这常使人们误以为sizeof是个函数),但操作数如果是变量则不必加括号”。巧了,我之前一直以为sizeof是函数......,这里查查手册记录一下。

1. sizeof 运算符

sizeof 返回一个表达式或者一个类型名所占的字节数,使用语法有两种:
(1) sizeof( type ); //返回type类型所占的字节数
(2) sizeof expression; //返回expression结果类型的大小(并不计算表达式实际的值)
注:根据计算架构不同一个字节的比特数可能不一样,但是按照标准下面的表达式都应该是1byte

  • sizeof(char)
  • sizeof(signed char)
  • sizeof(unsigned char)

2. 示例

struct myData {
    int a;
    char b;
};

void test_c()
{
    //计算数组的长度,
    //一般情况下把数组名视为数组第一个元素的地址
    //例外情况是使用 sizeof 操作符作用于数组名时,返回整个数组所占字节数;
    int a[10] = { 0 };
    int lena = sizeof a / sizeof a[0];
    std::cout << "lena = " << lena << "\n";

    myData data,*p;
    sizeof(myData);         //存储myData类型的对象所占的字节数
    sizeof data;            //data变量的类型占据的空间的字节数,相当于sizeof(myData)
    sizeof p;               //指针p所占空间的字节数
    sizeof *p;              //p指向的类型占据的空间的字节数,相当于sizeof(myData)
    sizeof data.a;          //结构体成员对应类型的大小
    sizeof myData::a;       //另一种获取结构体成员大小的方法

    std::cout <<
        "sizeof(myData) = " << sizeof(myData) << "\n" <<
        "sizeof data = " << sizeof data << "\n" <<
        "sizeof p = " << sizeof p << "\n" <<
        "sizeof *p = " << sizeof *p << "\n" <<
        "sizeof data.a = " << sizeof data.a << "\n" <<
        "sizeof myData::a = " << sizeof myData::a << "\n";

    char *c;
    std::cout <<
        "sizeof c = " << sizeof c << "\n" <<
        "sizeof *c = " << sizeof *c << "\n";
 }

输出:

lena = 10
sizeof(myData) = 8
sizeof data = 8
sizeof p = 8
sizeof *p = 8
sizeof data.a = 4
sizeof myData::a = 4
sizeof c = 8
sizeof *c = 1
  • 注1:sizeof * p;
    sizeof 运算符满足右结合律,而且优先级和*一样,所以sizeof *p等价于sizeof(*p),这里sizeof并不会实际去求*p的值,所以即使p是一个空指针也不会有任何问题。
  • 注2:sizeof a;
    在C++中一般情况下把数组名视为数组第一个元素的地址,一种例外情况是使用 sizeof 操作符作用于数组名时,返回整个数组所占字节数。sizeof 作用于指针时,得到的是指针的长度,即使指针指向的是一个数组。----<<C++ Primer Plus (中文5th)>>P100,P101

参考

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容