书写格式
Struct name
{
};
union name
{
};
二者书写时都可以采用匿名书写,但是匿名书写只能使用一次,而且不能自引用.如果想要重复使用,可以采用typedef的方式,
内存大小的计算
结构体:
内部第一个成员的偏移数为0,地址即为结构体起始地址,后续成员对齐到对齐数的整数倍,整体的大小为最大对齐数的整数倍.对于内嵌结构体,结构体对齐到其内部成员的最大对齐数的整数倍.
内对齐的意义:
为了跨平台性
提高查找时的性能
书写时应当把按照内存大小由小至大依次创建变量.
在VS系统下对齐数默认值为8,对齐数就是默认值和该成员内存大小的较小值.可以用#pragma pack()调整默认值,适时时候调整能节省结构体空间大小与效率.
结构体中有个特殊用法叫做位段,例如
Struct s
{
int a:2;
};
其中成员只能是整形家族,:为二进制操作符,后面数字表示所创建变量管理的空间大小,单位是比特.
在输入值的时候不能直接采用scanf(...,&..),因为很多成员都在一个字节内,故地址相同.依照从小位开始存储,当剩余空位不满足所要存储数据时,会舍弃剩余空间,去下个字节空间开始存储,地址由低到高.(所提全为在VS编译器下)但位段不具备跨平台性,使用时需谨慎.
联合体:
所有成员共用一个起始位置,内存大小至少为最大成员大小,当最大成员大小不是最大对齐数整数倍时,对齐到最大对齐数的整数倍.当联合体其中一个成员值发生改变时,其他成员值也会发生相应改变.联合体使用的优点是能极大化节省空间,但需注意使用,最好做到独立对象,不改变剩余值.
另提:枚举
书写格式
enum name
{
..,
..,
}
在其中可以赋值,如变量未被赋值,则按照0,1,2,3....的顺序默认初始赋值,如中间有被赋值的数字,其后面储存值依次为上个数字加一.
枚举能让我看读代码时更加直观,并且更加方便观察代码内部,且更加安全.
本篇文章为个人学习总结笔记,如有不懂可来问.