联合体让多个成员共享同一块存储空间。联合体的大小至少能容纳最大的成员,但同一时刻通常只把最后写入的成员视为有效。它适合表达“多种表示中的一种”,但程序必须另外记录当前使用的是哪一种。
#include <stdio.h>
union Value {
int whole;
double decimal;
char letter;
};
int main(void) {
union Value value;
value.whole = 42;
printf("whole: %d\n", value.whole);
value.decimal = 3.5;
printf("decimal: %.1f\n", value.decimal);
value.letter = 'Z';
printf("letter: %c\n", value.letter);
return 0;
}写入 decimal 后,不要再把先前的 whole 当作仍然保存着 42。成员覆盖同一存储区域;读取非当前成员会把相同对象表示解释成另一种类型,结果不适合作为普通数据转换。
互动实验
一块存储,三种成员视图
访问权限免费
三个成员的起始地址相同。点击赋值,观察同一块内存如何被重新解释,而不是多存一份数据。
union Value {
int whole;
double decimal;
char letter;
};
union Value value;
尚未写入任何成员
示意采用 int 4、double 8、char 1 字节,联合体大小为 8 字节;实际大小用 sizeof 查询。颜色表示本次成员的写入范围,不表示具体字节值;未高亮区域不保证清零,也不用于恢复旧成员。选择一条赋值语句。高亮范围会从同一个地址开始,随着成员类型改变。
知识测验
题目
给 value.decimal 赋值后,为什么不能继续依赖 value.whole 的旧值?