1.介绍
union是一种特殊的数据类型,它允许你在同一块内存区域中存储不同的数据类型。它的主要目的是节省内存,尤其是在处理多种可能的数据类型,但一次只使用其中一种的场景。
2.特点
与 struct
(结构体)不同,结构体的每个成员都拥有自己独立的内存空间,而联合的所有成员都共享同一段内存。这意味着,你给一个成员赋值,会覆盖其他成员的值(因为它们都使用相同的内存起始地址)。
一个联合的大小至少等于其最大成员的大小,以确保能容纳下任何一个成员。
3.使用方式
union UnionName {
member_type1 member1;
member_type2 member2;
member_type3 member3;
// ...
};
4.例子
#include <stdio.h>
#include <string.h>
union Data {
int i;
float f;
char str[20];
};
int main() {
union Data data;
// 使用整数成员
data.i = 10;
printf("data.i : %d\n", data.i); // 输出: data.i : 10
// 使用浮点数成员 - 这会覆盖 i 的内存
data.f = 220.5;
printf("data.f : %.2f\n", data.f); // 输出: data.f : 220.50
// 此时再读取 data.i 将是无意义的值(是浮点数 220.5 的二进制解释)
printf("data.i (after setting f) : %d (nonsense)\n", data.i);
// 使用字符数组成员 - 这会覆盖之前所有的内存
strcpy(data.str, "C Programming");
printf("data.str : %s\n", data.str); // 输出: data.str : C Programming
// 此时读取 i 或 f 都将是无意义的值
printf("data.i (after setting str) : %d (nonsense)\n", data.i);
printf("data.f (after setting str) : %.2f (nonsense)\n", data.f);
return 0;
}
输出结果:
data.i : 10
data.f : 220.50
data.i (after setting f) : 1100006400 (nonsense)
data.str : C Programming
data.i (after setting str) : 1819043147 (nonsense)
data.f (after setting str) : 9129985281638201200000000000000.00 (nonsense)