一.联合体的声明
联合体同结构体相似,也是由一个或多个成员组成,但编译器值为最大的成员分配空间。
特点:所以成员共用一块内存空间,也叫做共用体。
关键字:union。
例如:
联合体的声明与结构体相似,只是将struct换成union即可。
union 联合体名
{
成员列表
}(变量列表);
二.联合体的内存大小
联合体的内存分配时遵循下面两条原则:
1.至少是最大成员的大小。
2.当最大成员大小不是最大对齐数(见上一节结构体)的整数倍时,就要对齐到最大对齐数的整数倍。说白了,就是联合体的大小一定是最大对齐数的整数倍。
下面通过画图的方式加深理解:
也就是说第一个字节其实是c和i共用的,对其中一个成员赋值,可能会导致其他成员也发生变化。
例如:
可以看到对c的赋值导致i的最低的一个字节也发生了改变。(注:这里我们是在小端机器上测试的),如果是大端存储,那么就是最高位一个字节被改变。
这里简单解释一下什么是大小端存储
大端存储:数据的低位字节内容保存在高地址处。
小端存储:数据的低位字节保存在高地址处。
由上述例子可以看出联合体的优点就是:在一定条件下要比结构体节省空间。
下面举两个运用联合体的特性巧妙的解决问题的例子:
1.判断大小端存储
现在的要求是写一个函数来判断当前机器是大端存储还是小端存储。
如果我们没有学习联合体,可以这样做:
而如果学会了联合体,我们可以更加“优美”的解决这个问题:
2.取出一个int类型数据的每一个字节的数据。
可能我们第一时间想到的思路就是取出int的地址,将它强制类型转换成char*,再一个字节一个字节的取。下面 再给大家介绍一种神仙操作。
三.枚举
枚举顾名思义就是把所有可能取值都一 一列举出来。例如一个星期有几天,性别的可能情况等等。
关键字:enum
声明与结构体也有类似之处,但是细节上有所差异。
例如:
{ } 中的内容就是枚举类型的可能取值,也叫枚举常量。
如果我们将鼠标放在这些枚举常量上会发现这些常量是有初值的。
默认从0开始,依次增加一。
当然我们也可以在声明的时候给这些枚举常量赋一个初值(只能是有符号整数)。
如果我们去以%d的形式打印这些枚举常量,得到的就是他们的值。
其实,枚举的作用和#define非常相似,他们都是给一个标识符定义一个值。
但是枚举相较于#define是有优点的:
1.使用枚举可以增加代码的可读性
2.和#define相比,枚举具有类型,更加严谨。
3.便于调试,预处理阶段会删除#define定义的符合号。
4.使用方便,可以一次性定义多个常量。
5.有作用域。
基于以上的原因,我们一般情况下不要过多的使用#define.
下面我们可以简单举一个应用枚举的例子:
这样书写可以更加直观的清楚,一个分支是进入,另一个分支是退出。增加了代码的可读性。
本节内容结束,感谢您的观看!
记得点赞关注哦!