关键字和运算符sizeof详解

本文详细介绍了C/C++中sizeof运算符的使用,包括基本数据类型、自定义类型、指针变量、函数、数组、结构体、类、位域结构体和联合的sizeof计算规则。通过实例解析了sizeof在不同情况下的行为,强调了其在编译时刻计算、函数类型和位域成员的限制。文章还提到了sizeof与strlen的区别,以及如何在VS IDE中查看类内存分布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

在学习C语言时,老师讲解sizeof时还以为就是一个普通的运算符,只是用来计算所占字节的,现在看来要么我当时在睡觉,要么我灵魂在出窍。在找工作笔试的过程中,总是会碰到关于sizeof用法的各种题目,碰到比较难度比较大的题目时,曾经一度的怀疑人生。现在就把这个运算符的使用归纳一下,以免以后还怀疑人生。

概念及语法

定义:sizeof运算符返回一条表达式一个类型名字所占的字节数。返回值是一个size_t类型的常量表达式。

根据其定义就能看出来,语法分为两种形式:

sizeof	(type)	返回类型的大小
sizeof	expr	返回表达式结果类型的大小

例如:

Sales_data    data, *p;    

sizeof(Sales_data);		//存储Sales_data类型的对象所占的空间大小
sizeof  data;			//data的类型的大小,即sizeof(Sales_data)
sizeof  p;				//指针所占空间的大小
sizeof  *p;				//p所指类型的空间大小,即sizeof(Sales_data)

sizeof  data.revenue;	 		//Sales_data的revenue成员对应的类型大小
sizeof Sales_data::revenue; 	//另一种获取revenue大小的方式

通过最后一个例子可以看出,sizeof允许我们使用作用域运算符来获取类成员的大小。通常情况下只有通过类的对象才能访问到类的成员但是sizeof运算符无须我们提供一个具体的对象。

注意:sizeof 并不实际计算其运算对象的值,例如:

int a = 0;
cout << sizeof(a = 3) << endl;	//4
cout << a << endl;				//0 sizeof并不实际计算

输出的结果为4 和 0。原因是C/C++是静态强类型语言,所有数据类型的占用空间大小都是确定的。同时sizeof的计算发生在编译器时刻,编译器知道类型的大小,所以sizeof计算的类型大小在编译器的时刻就知道了。回应了前面sizeof的定义,返回值是一个常量表达式

C99标准规定,函数类型、不能确定类型的表达式以及位域成员不能被计算sizeof值。估计都看晕了,举例说明吧:

int foo()
{
	retrun 1;
}
sizeof(foo);		//错误,编译通不过
void foo2(){}
sizeof(foo2() );	//错误
struct  S
{
	unsigned  int  f1 : 1;
	unsigned  int  f2 : 5;
	unsigned  int  f3 : 12;
}
sizeof(S.f1);		//错误

下面让我们从各个角度对sizeof进行解析,说明一下有时在不同位数的系统下,sizeof的计算会有差别,如果没有特别声明的话默认为32位系统。

1、基本数据类型的sizeof

基本数据类型是指char、short、int、float、double、long double这样的内置数据类型。
由于他们有的内存大小和系统有关,所以在不同的系统下取值可能不一样。

在32位和64位机器上对应的大小都是:1、2、4、4、8、8
但在16位机器上就有差别了。

bool值,在C++中属于内置类型,数值为true和false,sizeof大小为1。在C中不属于内置类型,数值为1和0,sizeof应该为4(我没有验证这个)。

至于整形的可用修饰词unsigned,它只影响最高位bit的意义,所占长度不会改变。

2、自定义数据类型

用typedef或using定义的自定义类型,例如

typedef  short  WORD;
using  DWORD  =  long;
cout<<(sizeof(short) == sizeof(WORD))<<endl; // 相等,输出 1
cout<<(sizeof(long) == sizeof(DWORD))<<endl; // 相等,输出 1 

所以自定义类型的sizeof取值等同于它的类型原形。

3、指针变量的sizeof

指针是存储单元的地址,sizeof指针变量就等于计算机内部地址总线的宽度。所以在32位计算机中,一个指针变量的返回值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值