跳到主要内容

C 语言联合体

提示
  1. 定义联合体:在C语言中,使用union关键字定义联合体,类似于结构体,但联合体一次只能存储一个成员的值。
  2. 创建联合体变量:定义联合体后,可以创建联合体变量,例如union car car1, car2, *car3;,用于存储和操作数据。
  3. 联合体与结构体的区别:联合体的大小等于其最大成员的大小,所有成员共享相同的内存空间;而结构体的大小等于其所有成员大小之和。

联合体是一种与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的价格,使用car1.price
  • 使用car3访问价格时,可以使用(*car3).pricecar3->price

联合体和结构体的区别

让我们举一个例子来展示联合体和结构体之间的区别:

#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("联合体大小 = %d 字节", sizeof(uJob));
printf("\n结构体大小 = %d 字节", sizeof(sJob));
return 0;
}

输出

联合体大小 = 32
结构体大小 = 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;

// 当j.workerNo被赋值时,
// j.salary将不再保持12.3
j.workerNo = 100;

printf("工资 = %.1f\n", j.salary);
printf("工人数量 = %d", j.workerNo);
return 0;
}

输出

工资 = 0.0
工人数量 = 100

要了解联合体的使用场景,请访问为什么我们需要C联合体?