C语言联合体详解:定义、用法与结构体对比
C语言联合体详解
学习如何定义、创建和访问C联合体,理解其在内存布局和应用上与结构体的差异。
联合体是C语言用户定义类型,与结构体不同,同一时刻只能保存一个成员值。这使联合体适合内存高效的数据表示和底层编程中的类型双关。
定义联合体
使用 union 关键字声明新类型。例如:
union Car {
char name[50];
int price;
};
上述代码创建派生类型 union Car,可存储 50 字符字符串或整型价格。
创建联合体变量
定义联合体不分配内存。使用时声明该类型变量:
union Car car1, car2, *car3;
也可合并定义和变量声明:
union Car {
char name[50];
int price;
} car1, car2, *car3;
两例中 car1 和 car2 是联合体实例,car3 是联合体指针。
访问联合体成员
直接访问用点(.)运算符,指针访问用箭头(->):
car1.price– 访问car1的 price 字段。car3->price或(*car3).price– 通过指针访问 price。
联合体 vs 结构体
结构体为所有成员分配空间,联合体大小等于其最大成员大小。对比示例:
#include <stdio.h>
union UnionJob {
char name[32];
float salary;
int workerNo;
} uJob;
struct StructJob {
char name[32];
float salary;
int workerNo;
} sJob;
int main() {
printf("size of union = %zu bytes\n", sizeof(uJob));
printf("size of structure = %zu bytes", sizeof(sJob));
return 0;
}
输出:
size of union = 32 size of structure = 40
结构体占 40 字节(32+4+4),联合体仅 32 字节——最大成员 name[32] 的大小。所有联合体成员共享同一内存区域。
实战示例:成员覆盖
#include <stdio.h>
union Job {
float salary;
int workerNo;
} j;
int main() {
j.salary = 12.3;
j.workerNo = 100; // 覆盖前一个值
printf("Salary = %.1f\n", j.salary);
printf("Number of workers = %d", j.workerNo);
return 0;
}
输出:
Salary = 0.0 Number of workers = 100
因 salary 和 workerNo 共享内存,写入其中一个会清除另一个。
探索实际用例,阅读 为何需要C联合体?。
C语言