13 · 共用体 / 位域 / 枚举 / typedef
共用体 union(C 特色:所有成员共享同一块内存)
union Data {
int i;
float f;
char str[20];
}; // 大小 = 最大成员的大小(此处 20 字节)
union Data d;
d.i = 10; // 写入 i
printf("%d\n", d.i); // 10
d.f = 3.14; // ⚠️ 写入 f 会覆盖 i(同一块内存!)
printf("%d\n", d.i); // 已是垃圾值
用途:省内存、类型双关(同一个二进制按不同类型解读)。 风险:同时只用其中一个成员,读非当前写入的成员是未定义行为。
struct vs union
| 大小 | 成员 | |
|---|---|---|
| struct | 各成员大小之和(+对齐填充) | 各自独立 |
| union | 最大成员的大小 | 共享同一块内存 |
位域(精确控制到 bit)
struct Flags {
unsigned int a : 1; // 占 1 位
unsigned int b : 2; // 占 2 位
unsigned int c : 3; // 占 3 位
};
用于嵌入式、协议报文等需要精细控制内存布局的场景。
枚举 enum
enum Color { RED, GREEN, BLUE }; // 默认 0, 1, 2
enum Status { OK = 200, NOT_FOUND = 404 };
enum Color c = RED;
printf("%d\n", c); // 0
本质是具名整型常量,比 #define 更好(有类型、可调试、成组管理)。
typedef(起别名)
typedef unsigned int uint;
typedef struct Node { struct Node *next; } Node; // 结构体别名(常用!)
uint a = 10; // 等价于 unsigned int a
Node *head = NULL; // 不用再写 struct Node *
区分 #define 和 typedef:#define 是文本替换(预处理阶段),typedef 是真正的类型别名(编译阶段,有类型检查)。