13 · 共用体 / 位域 / 枚举 / typedef

2026.09.27 · 🟡 中

共用体 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 是真正的类型别名(编译阶段,有类型检查)。

关联

12-结构体 · 16-预处理器与头文件 · 03-数据类型与变量