大家好,今天带来 C 语言联合体(共用体)和枚举类型的完整精讲。这两个是 C 语言自定义类型的最后两块拼图,面试常考、开发常用。
目录
- 联合体类型的声明
- 联合体的特点
- 联合体大小的计算
- 联合体实战:判断大小端
- 枚举类型的声明
- 枚举类型的优点
- 枚举类型的使用
- 全文总结
- 面试高频考点
1. 联合体类型的声明
联合体(union)也叫共用体,和结构体类似,但所有成员共用同一块内存空间。
// 联合类型声明 union Un { char c; int i; }; int main() { // 定义联合变量 union Un un = {0}; printf("%d\n", sizeof(un)); // 输出 4 return 0; }2. 联合体的特点
- 所有成员共用同一块内存
- 给一个成员赋值,会覆盖其他成员的值
- 联合体大小至少是最大成员的大小
// 验证地址相同 union Un { char c; int i; }; int main() { union Un un = {0}; printf("%p\n", &(un.i)); printf("%p\n", &(un.c)); printf("%p\n", &un); // 三个地址完全一样! return 0; }// 赋值覆盖示例 union Un un = {0}; un.i = 0x11223344; un.c = 0x55; printf("%x\n", un.i); // 输出:112233553. 联合体大小的计算
规则:
- 至少是最大成员的大小
- 必须是最大对齐数的整数倍
union Un1 { char c[5]; // 5字节 int i; // 4字节 }; // 最大对齐数 4 → 5 → 对齐到 8 printf("%d\n", sizeof(union Un1)); // 8 union Un2 { short c[7]; // 14字节 int i; // 4字节 }; // 最大对齐数 4 → 14 → 对齐到 16 printf("%d\n", sizeof(union Un2)); // 164. 联合体实战:判断大小端
面试高频手写题:用联合体判断机器大小端。
int check_sys() { union { int i; char c; }un; un.i = 1; // 返回1 → 小端;返回0 → 大端 return un.c; }5. 枚举类型的声明
枚举就是把可能的值一一列举,枚举常量默认从0开始,依次 + 1。
// 星期 enum Day { Mon, Tues, Wed, Thur, Fri, Sat, Sun }; // 性别 enum Sex { MALE, FEMALE, SECRET }; // 颜色(可赋初值) enum Color { RED = 2, GREEN = 4, BLUE = 8 };6. 枚举类型的优点
相比#define,枚举更强大:
- 代码可读性、可维护性更强
- 有类型检查,更严谨
- 便于调试,#define 在预处理阶段就消失
- 一次可定义多个常量
- 遵循作用域规则
7. 枚举类型的使用
enum Color { RED = 1, GREEN = 2, BLUE = 4 }; int main() { // 使用枚举常量赋值 enum Color clr = GREEN; printf("%d\n", clr); // 2 return 0; }注意:
- C 语言:可以用整数给枚举变量赋值
- C++:不允许,类型检查更严格
8. 全文总结
联合体(union)
- 成员共用内存,空间复用
- 大小 = 最大成员大小,且对齐到最大对齐数
- 常用于大小端判断、节省内存、数据覆盖场景
枚举(enum)
- 把取值一一列举,默认从 0 开始
- 比 #define更安全、更易读、更好调试
- 适合状态、类型、选项等固定值场景
9. 面试高频考点
- 联合体和结构体的区别
- 联合体大小计算规则
- 手写联合体判断大小端
- 枚举与 #define 的区别
- 枚举常量默认值规则