结构体与联合体的特殊点

书写格式

Struct name

{

};

union name

{

};

二者书写时都可以采用匿名书写,但是匿名书写只能使用一次,而且不能自引用.如果想要重复使用,可以采用typedef的方式,

内存大小的计算

结构体:

内部第一个成员的偏移数为0,地址即为结构体起始地址,后续成员对齐到对齐数的整数倍,整体的大小为最大对齐数的整数倍.对于内嵌结构体,结构体对齐到其内部成员的最大对齐数的整数倍.

内对齐的意义:

为了跨平台性

提高查找时的性能

书写时应当把按照内存大小由小至大依次创建变量.

在VS系统下对齐数默认值为8,对齐数就是默认值和该成员内存大小的较小值.可以用#pragma pack()调整默认值,适时时候调整能节省结构体空间大小与效率.

结构体中有个特殊用法叫做位段,例如

Struct s

{

int a:2;

};

其中成员只能是整形家族,:为二进制操作符,后面数字表示所创建变量管理的空间大小,单位是比特.

在输入值的时候不能直接采用scanf(...,&..),因为很多成员都在一个字节内,故地址相同.依照从小位开始存储,当剩余空位不满足所要存储数据时,会舍弃剩余空间,去下个字节空间开始存储,地址由低到高.(所提全为在VS编译器下)但位段不具备跨平台性,使用时需谨慎.

联合体:

所有成员共用一个起始位置,内存大小至少为最大成员大小,当最大成员大小不是最大对齐数整数倍时,对齐到最大对齐数的整数倍.当联合体其中一个成员值发生改变时,其他成员值也会发生相应改变.联合体使用的优点是能极大化节省空间,但需注意使用,最好做到独立对象,不改变剩余值.

另提:枚举

书写格式

enum name

{

..,

..,

}

在其中可以赋值,如变量未被赋值,则按照0,1,2,3....的顺序默认初始赋值,如中间有被赋值的数字,其后面储存值依次为上个数字加一.

枚举能让我看读代码时更加直观,并且更加方便观察代码内部,且更加安全.

本篇文章为个人学习总结笔记,如有不懂可来问.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值