自定义类型---联合体与枚举

一.联合体的声明

联合体同结构体相似,也是由一个或多个成员组成,但编译器值为最大的成员分配空间。

特点:所以成员共用一块内存空间,也叫做共用体。

关键字: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. 

下面我们可以简单举一个应用枚举的例子:

这样书写可以更加直观的清楚,一个分支是进入,另一个分支是退出。增加了代码的可读性。 

本节内容结束,感谢您的观看!

记得点赞关注哦!

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值