联合是用户定义的类型,与 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 联合?