C语言初学笔记【联合与枚举】
文章目录
- 前言
- 一、联合体
- 1. 联合体类型的声明
- 2. 联合体的特点
- 3. 联合体 vs 结构体
- 4. 联合体大小的计算
- 5. 联合体的应用
- 二、枚举类型
- 1. 枚举类型的声明
- 2. 枚举的优点
- 3. 枚举的使用
- 三、补充说明
- 总结
前言
学习笔记:自定义类型——联合和枚举
一、联合体
1. 联合体类型的声明
· 联合体是一种自定义类型,允许在同一内存空间中存储不同类型的成员。
· 语法类似于结构体,但所有成员共享同一块内存。
· 示例:
union Un {char c;int i;
};
2. 联合体的特点
· 所有成员共用同一块内存空间。
· 修改一个成员会影响其他成员的值。
· 联合体的大小至少等于其最大成员的大小。
· 示例:
union Un un;
un.i = 0x11223344;
un.c = 0x55; // 此时 un.i 的值变为 0x11223355
3. 联合体 vs 结构体
· 结构体每个成员有独立的内存空间,联合体所有成员共享同一内存。
· 结构体大小等于所有成员大小之和(考虑对齐),联合体大小等于最大成员大小(考虑对齐)。
4. 联合体大小的计算
· 联合体大小至少是最大成员的大小。
· 如果最大成员的大小不是最大对齐数的整数倍,则需对齐到最大对齐数的整数倍。
· 示例:
union Un1 {char c[5]; // 5字节int i; // 4字节,对齐数为4
};
// sizeof(union Un1) = 8(对齐到4的倍数)
5. 联合体的应用
· 节省内存,适用于同一时间只使用其中一种成员的场景。
· 示例:礼品兑换单中不同类型的商品属性共用同一内存。
1.6 练习:判断机器字节序(大端/小端)
int check_sys() {union {int i;char c;} un;un.i = 1;return un.c; // 返回1为小端,0为大端
}
二、枚举类型
1. 枚举类型的声明
· 枚举用于定义一组具名的整型常量。
· 语法:
enum Day {Mon, Tues, Wed, Thur, Fri, Sat, Sun
};
· 默认从0开始递增,也可手动赋值:
enum Color {RED = 2,GREEN = 4,BLUE = 8
};
2. 枚举的优点
- 增强代码可读性和可维护性:使用有意义的名字代替数字。
- 类型检查:比 #define 更严谨,有类型信息。
- 便于调试:枚举常量在编译阶段保留,而 #define 在预处理后被替换。
- 一次定义多个常量:简洁高效。
- 作用域规则:枚举类型遵循作用域,可限制使用范围。
3. 枚举的使用
· 定义枚举变量:
enum Color clr = GREEN;
· C语言中可用整数值给枚举变量赋值,C++中不允许(类型不同)。
三、补充说明
· 联合体常用于底层编程、内存优化和类型转换场景。
· 枚举适用于状态机、选项配置等需明确含义的场合。
✅ 建议多通过代码实践理解联合体和枚举的内存布局和使用场景。
总结
特性 | 联合体 | 枚举 |
---|---|---|
内存使用 | 共用内存,节省空间 | 不占额外内存(仅是整型常量) |
用途 | 同一时间只使用一个成员 | 定义一组相关的命名常量 |
类型安全 | 弱类型 | 强类型,C++中更严格 |
可读性 | 低(需谨慎使用) | 高(语义明确) |