C 联合体
C 联合体
联合体 union 与结构体 struct 类似,因为它可以存储不同数据类型的成员。
但是,它们之间也存在一些区别:
- 在结构体
struct中,每个成员都有自己的内存。 - 在联合体
union中,所有成员共享同一内存,这意味着一次只能使用其中一个值。
大多数情况下,你会使用struct(结构体)而不是联合体,因为结构体可以同时存储和访问多个值,这在日常程序中更为常见。
但是,当你只需要一次存储几种可能类型中的一种,并且想要节省内存时,联合体就非常有用。
声明联合体
要创建联合体,请使用 union 关键字,然后从中创建一个变量(就像创建结构体一样):
示例
union
myUnion { // Union declaration
int myNum; // Member (int)
char myLetter; // Member (char)
char myString[30]; // Member (char array)
};
int main() {
union myUnion u1; // 创建一个名为"u1"的联合变量:
return 0;
}
访问联合体成员
与结构体类似,要访问联合体的成员,请使用点号 . 语法。
重要提示:由于所有成员共享同一内存,更改其中一个成员会影响其他成员。只有最后赋值的成员才具有有效值。
示例
union myUnion {
int myNum;
char myLetter;
char myString[30];
};
int main() {
union myUnion u1;
u1.myNum = 1000;
// 由于这是写入联合体的最后一个值,myNum 不再包含 1000——它的值现在无效。
u1.myLetter = 'A';
printf("myNum: %d", u1.myNum); // 该值不再可靠。
printf("myLetter: %c", u1.myLetter); // 打印"A"
return 0;
}
亲自试一试 »
联合体的大小
联合体的大小始终与其最大成员的大小相同:
示例
union myUnion {
int myNum;
char myString[36];
};
int main() {
union myUnion u1;
printf("Size of union: %zu bytes", sizeof(u1));
return 0;
}
亲自试一试 »
由于最大的成员是 36 字节,因此整个 union 联合也将是 36 字节。
如果它是一个结构体(struct),则大小为 40 字节:
myNum(4 字节)+ myString(36 字节)= 总计 40 字节
何时使用联合体
以下情况可以使用联合体:
- 需要将不同类型的数据存储在同一位置
- 一次只使用一种类型的数据
- 节省内存非常重要

