联合体是一种用户定义类型,与 C 结构体 类似,但有一个关键区别。
结构体分配足够的空间来存储所有成员,而联合体一次只能存储一个成员的值。
如何定义联合体?
我们使用 union
关键字来定义联合体。下面是一个例子
union car
{
char name[50];
int price;
};
上面的代码定义了一个派生类型 union car
。
创建联合体变量
当定义一个联合体时,它会创建一个用户定义的类型。但是,不会分配内存。要为给定的联合体类型分配内存并使用它,我们需要创建变量。
这是我们创建联合体变量的方式。
union car
{
char name[50];
int price;
};
int main()
{
union car car1, car2, *car3;
return 0;
}
创建联合体变量的另一种方式是
union car
{
char name[50];
int price;
} car1, car2, *car3;
在以上两种情况下,都创建了 union car
类型的联合体变量 car1、car2 和联合体指针 car3。
访问联合体成员
我们使用 .
运算符来访问联合体的成员。要访问指针变量,我们使用 ->
运算符。
在上面的例子中:
- 要访问
car1
的 price,使用car1.price
。 - 要使用
car3
访问 price,可以使用(*car3).price
或car3->price
。
联合体与结构体的区别
让我们通过一个例子来演示联合体和结构体的区别
#include <stdio.h>
union unionJob
{
//defining a union
char name[32];
float salary;
int workerNo;
} uJob;
struct structJob
{
char name[32];
float salary;
int workerNo;
} sJob;
int main()
{
printf("size of union = %d bytes", sizeof(uJob));
printf("\nsize of structure = %d bytes", sizeof(sJob));
return 0;
}
输出
size of union = 32 size of structure = 40
为什么联合体和结构体变量的大小会有这种差异?
在这里,sJob 的大小是 40 字节,因为
name[32]
的大小是 32 字节salary
的大小是 4 字节workerNo
的大小是 4 字节
然而,uJob 的大小是 32 字节。这是因为联合体变量的大小始终是其最大元素的尺寸。在上面的示例中,其最大元素(name[32]
)的大小是 32 字节。
在联合体中,所有成员共享相同的内存。
示例:访问联合体成员
#include <stdio.h>
union Job {
float salary;
int workerNo;
} j;
int main() {
j.salary = 12.3;
// when j.workerNo is assigned a value,
// j.salary will no longer hold 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
要了解联合体的用途,请访问 为什么我们需要 C 联合体?