目录
1、联合体
1.1、什么是联合体
1.2、联合体的声明
1.3、联合体的特点
1.4、联合体与结构体区别
1.5、联合体的大小
2、枚举
2.1、枚举类型的声明
2.2、枚举类型的优点
3、三种自定义类型:结构体、联合体、枚举
正文
1、联合体
1.1、什么是联合体
联合体是由一个或多个成员构成,这些成员可以是不同的类型。
但编译器只为最大的成员分配足够的内存空间。联合体的特点是所有成员共用一块内存空间。
故,联合体也叫共用体。
给联合体的一个成员赋值,其他成员的值也会跟着变化。
1.2、联合体的声明
1.3、联合体的特点
联合体的所有成员共用同一块内存空间,那么联合体的大小至少是最大成员的大小。
如下面的例子:结构体的地址与成员地址相等。
则可知联合体的成员存储方式:
所有成员存储在同一块空间中,每个成员不可能同时使用。
1.4、联合体与结构体的区别
结构体 | 联合体 | |
关键字 | struct | union |
成员 | 多个成员 | 多个成员 |
存放 | 每个成员都有自己的内存空间 | 所有成员共用同一块内存空间 |
1.5、联合体的大小
- 联合体的大小至少是最大成员的大小。
- 当最大成员大小不是最大对齐数的整数倍时,需要对齐到最大对齐数的整数倍。需要包含到最大成员的大小。
故,使用联合体可以节省空间。但里面的成员不能同时使用。
之前的判断大小端问题,也可以使用联合体来写
2、枚举
2.1、枚举类型的声明
枚举:把可能的取值一一列举。
比如,现实生活中,星期、月份、性别、颜色等都是可以一一列举的,这些数据的表示可以使用枚举。
花括号里面的内容是枚举类型的可能取值,也叫枚举常量
这些可能取值都是有值的,默认从0开始,依次递增1,也可以赋初始值。
2.2、枚举类型的优点
- 增加代码的可读性和可维护性
- 与#define定义的标识符相比,枚举有类型的检查,更加严谨
- 便于调试,预处理阶段会删除#define定义的符号
- 方便使用,一次可定义多个常量
- 枚举常量是遵循作用域规则的,枚举声明在函数内就只能在函数中使用
3、三种自定义类型:
名称 | 结构体 | 联合体 | 枚举 |
关键字 | struct | union | enum |
成员 | 多种成员 | 多种成员 | 多种成员 |
存放 | 每个成员都有独立的空间 | 所有成员共用同一块空间 | 每个成员都有独立的空间 |