本篇彻底搞懂 联合体(共用体) 和 枚举类型,语法 + 内存 + 面试点 + 使用场景一篇到位!
📑 目录
- 联合体(共用体)
- 声明与定义
- 核心特点
- 结构体 vs 联合体
- 大小计算规则
- 经典应用:判断大小端
- 枚举类型
- 声明与赋值
- 默认值规则
- 枚举的优点
- 使用方式
- 三大自定义类型对比表
- 总结
1. 联合体(共用体)union
联合体也叫共用体,和结构体语法相似,但内存管理完全不同。
1.1 声明格式
union 联合体名
{
成员列表;
};
示例:
union Un
{
char c;
int i;
};
1.2 核心特点(最重要!)
- 所有成员共用同一块内存空间
- 修改一个成员会直接覆盖其他成员的值
- 地址完全相同:
&un == &un.c == &un.i
union Un un;
printf("%p\n", &un);
printf("%p\n", &un.c);
printf("%p\n", &un.i);
运行后你会发现:三个地址一模一样!
1.3 结构体 vs 联合体
struct:各成员独立占用内存,总大小 = 所有成员 + 内存对齐
union:所有成员共用内存,大小由最大成员决定(联合体变量的大小至少是最大成员的大小)
示例:
struct S { char c; int i; }; // 大小 8
union Un { char c; int i; }; // 大小 4
1.4 联合体大小计算规则
- 大小 至少 >= 最大成员的大小
- 大小必须是 最大对齐数 的整数倍
示例 1:
union Un1
{
char c[5]; // 大小5,对齐数1
int i; // 大小4,对齐数4
};
// 最大对齐数4 → 总大小必须是4的倍数(5不是4的倍数)→ 总大小为 8
示例 2:
union Un2
{
short c[7]; // 14字节,对齐数2
int i; // 4字节,对齐数4
};
// 最大对齐数4 → 14不是4的倍数,浪费2个字节→ 总大小为 16
1.5 联合体经典面试题:判断大小端
先搞懂大端、小端(通俗版)
内存存数字时,字节的存放顺序不一样:
- 小端模式(你电脑 / Windows 默认):低字节放低地址(小的放前面) 例:数字
0x1234→ 内存存:34 12 - 大端模式(网络 / 单片机):高字节放低地址(大的放前面) 例:数字
0x1234→ 内存存:12 34
利用 “成员共用内存” 的特性,最简单的大小端判断法:
int check_sys()
{
union
{
int i;
char c;
}un;
un.i = 1;
// 返回1→小端;返回0→大端
return un.c;
}
✅ 小端:低字节存低地址 → un.c = 1
✅ 大端:高字节存低地址 → un.c = 0
2. 枚举类型 enum
2.1 枚举是什么
枚举就是把有限、固定、可列举的值一一列出来,比如:星期、性别、颜色........
2.2 声明格式
enum 枚举名
{
枚举常量1,
枚举常量2,
...
};
示例:
enum Day
{
Mon,
Tues,
Wed,
Thur,
Fri,
Sat,
Sun
};
2.3 默认值规则
- 默认从 0 开始
- 后一个比前一个 +1
- 支持手动赋初值
示例:
enum Color
{
RED = 2,
GREEN = 4,
BLUE = 8
};
2.4 枚举的优点(面试常问)
- 可读性极强:看到
RED就知道是红色 - 有类型检查,比
#define更安全严谨 - 便于调试,#define 预处理会被直接替换
- 一次定义一组常量,使用方便
- 遵循作用域,不会到处污染(枚举声明在函数内,只能在函数内使用)
2.5 枚举的使用
enum Color
{
RED = 1,
GREEN = 2,
BLUE = 4
};
// 使用
enum Color clr = GREEN;
- C 语言:允许用整数给枚举变量赋值
- C++ :不允许,类型检查更严格
3. 结构体 + 联合体 + 枚举 最全对比表
| 特性 | 结构体 struct | 联合体 union | 枚举 enum |
|---|---|---|---|
| 关键字 | struct | union | enum |
| 内存特点 | 成员独立占用内存 | 所有成员共用同一块内存 | 本质是 int 常量 |
| 大小计算 | 内存对齐,总大小≥成员总和 | 大小 = 最大成员大小,且满足对齐 | 大小等于 int |
| 成员关系 | 同时存在、互不干扰 | 同一时间只用一个成员 | 一组固定常量 |
| 访问方式 | 变量. / 指针-> | 变量. / 指针-> | 直接使用枚举常量 |
| 适用场景 | 描述对象的多个属性 | 节省内存、类型转换、判断大小端 | 状态标识、选项、固定取值 |
| 典型例子 | 学生、员工、书籍 | 大小端检测、协议解析 | 星期、性别、颜色、状态码 |
4. 一句话总结
- 结构体:把多个属性打包在一起,各自独立。
- 联合体:多个成员共用内存,省空间、互斥使用。
- 枚举:定义一组有意义的常量,代码更清晰、更安全。
✨ 结尾鼓励
联合体和枚举是 C 语言走向工程化、规范化编程的标志,学会它们,你的代码可读性、内存效率、专业度都会直接上一个台阶!面试更是高频考点,一定要吃透~
对你有帮助的话,欢迎 点赞、收藏、关注,C 语言全套精讲持续更新!
&spm=1001.2101.3001.5002&articleId=160870142&d=1&t=3&u=484b114607174782b8eb2b4023a09a17)
4万+

被折叠的 条评论
为什么被折叠?



