引导语:sizeof是用c语言判断数据类型和表达式长度的符号。 以下是编辑分享给大家的东西。 请阅读。
1 .定义
sizeof是C/C的操作符***operator***,其目的是返回对象或类型所占用的内存字节数。 返回类型为size_t,在头文件stddef.h中定义。
这是依赖于编译系统的值,一般为typedef unsigned int size_t; 虽然林林总总很多,但作为一个规范,我们保证char,signed
char和unsigned char的sizeof值为1,毕竟char是可用于编程的最小数据类型。
MSDN中的说明如下。
thesizeofkeywordgivestheamountofstorage,in bytes,associated with avariable or a
type * * * includingaggregatetypes * *.thiskeywordreturnsavalueoftype
size_t。
2 .语法:
sizeof有以下三种语法形式。
1 * * * sizeof * * *对象* * *; //sizeof***对象**;
2*** sizeof*** type_name ***; //sizeof***型**;
3 * * *对象大小; //sizeof对象
所以以下三种sizeof的使用都是正确的
复制代码的话就是:
#包含
main******
{
int b;
printf***'%dn ',sizeof b***;
printf***'%dn ',sizeof***b******;
printf***'%dn ',sizeof***int******;
}
3 .基本数据类型的sizeof
这里的基本数据类型是简单的内置数据类型,如短、输入、长、浮点和双精度。 因为这些都是日式的
因为是相关的,所以不同的系统的值可能不同。 这引起了我们的注意,尽量不要
这方面给自己的程序移植带来了麻烦。 一般而言,在32位编译环境中,sizeof***int***的’值为4。
4 .指针变量的sizeof
等于计算机内部地址总线的宽度。 因此,请注意,在32位计算机上,一个指针变量的返回值始终为4***
以字节为单位***预计在未来的64位系统上,指针变量的sizeof结果为8。
指针变量的sizeof值与指针指向的对象无关。 因为所有指针变量所占的内存大小都相等
MFC消息处理函数可以通过两个参数WPARAM和LPARAM传递和使用各种复杂的消息结构***
指向结构的指针***。
5 .数组的sizeof
数组的sizeof值等于数组占用的内存字节数。 示例:
char a1[]='abc ';
int a2[3];
sizeof*** a1 ***; //结果为4,字符末尾还有一个空终止字符
sizeof*** a2 ***; //结果为3*4=12***int***
sizeof认为求出数组元素的个数是错误的。 要计算数组元素的个数,请输入int c1=sizeof*** a1 ***
/sizeof*** char ***; //全长/各个要素的长度
int C2=sizeof * * * a1 * */sizeof * * * a1 [0] * * *; //总长度/第一个元素的长度。 注意数组名称作为函数参数传递
时间退化为指针。
6 .结构的压缩
结构S1
{
char c;
int i;
(;
sizeof的结果等于对象或类型所占用的内存字节数。 现在,我们来看看S1的内存分配。 S1 s1
={ 'a ',0xFFFFFFFF }; s1的地址为0x0012FF78,其数据内容如下。
在012ff78:61CCccffffffffff之间插入3字节的cc来看看MSDN的说明。 When applied to a
structure type or variable,sizeof returns the actual size,which may
includepaddingbytesinsertedforalignment。
这就是字节对齐! 你需要告诉我为什么字节对齐计算机的构成原理有助于增加计算机的数量。 否则,就可以增加计算机的取数
必须多使用指令周期。 因此,编译器将缺省处理结构**
*实际上其它地方的数据变量也是如此***,让宽度为2的基本数据类型***short等***都位于能被2整除的地址上,让宽度为4的基本
数据类型***int等***都位于能被4整除的地址上,以此类推。这样,两个数中间就可能
需要加入填充字节,所以整个结构体的sizeof值就增长了。
1.sizeof是运算符,跟加减乘除的性质其实是一样的,在编译的时候进行执行,而不是在运行时才执行。
那么如果编程中验证这一点呢?
复制代码 代码如下:
#include
using namespace std;
int main******
{
int i=1;
cout<
sizeof***++i***;
cout<
return 1;
}
输入结果为 1
1
sizeof 中的++i 的副作用并没有显示出来,原因只可能有一个,在编译的时候sizeof执行以后将++i 处理了,++i 的副作用因此被消除了。如果sizeof 是在运行时进行的话,则肯定要注意++i 。实际上sizeof的实现应该是用宏来做的,宏在编译时进行执行。具体实现可以参考下面。
2.sizeof***'a'***在C语言中的结果是4,在C++中结果是1,看过某篇文章说C中sizeof侧重于“数”,而C++中sizeof更侧重于“字符”。
3.文章中讲了两个用宏实现sizeof的经典应用
复制代码 代码如下:
//适用于非数组
#define _sizeof***T*** ******size_t*********T****0 + 1******
//适用于数组
#define array_sizeof***T*** ******size_t******&T+1***-***size_t******&T******
先举两个小例子说明两个宏的应用,对于第一个如 _sizeof***int***; 的结果就是4;对于第二个先声明一个大小为4的数组int a[4];那么array_sizeof***a***结果为16.
对于非数组的宏定义,先是将0转换为T*类型的指针所指向的地址***此时地址为0***。然后对T类型的地址加1,相当于加上了T类型的大小***即得到了非数组T的大小***。前面的size_t只是将地址转化为int型的整数返回。
一个简单的例子:int* p; p=p+1; --------p是一个int*类型的指针, p+1在地址空间上相当于加上了4个字节。
对 于数组的宏定义,类似于非数组的宏定义,为了方便理解,这里可以把数组T看成一个用户自定义的类型,&T表示数组类型的指针,对于数组类型指针加 1相当于在地址上加上了该数组大小。由于是用户自定义的类型所以不能强制将0转化为数组类型的地址,只能用加1后的地址减去之前的地址,得到的差值就是数 组本身所占的字节大小。