简介:
今天在读《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
参考
- https://en.cppreference.com/w/cpp/language/sizeof
- <<C++ Primer Plus>>
- <<C++ Primer>>