C 联合体

联合体是一种用户定义类型,与 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 类型的联合体变量 car1car2 和联合体指针 car3


访问联合体成员

我们使用 . 运算符来访问联合体的成员。要访问指针变量,我们使用 -> 运算符。

在上面的例子中:

  • 要访问 car1price,使用 car1.price
  • 要使用 car3 访问 price,可以使用 (*car3).pricecar3->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 联合体?

你觉得这篇文章有帮助吗?

我们的高级学习平台,凭借十多年的经验和数千条反馈创建。

以前所未有的方式学习和提高您的编程技能。

试用 Programiz PRO
  • 交互式课程
  • 证书
  • AI 帮助
  • 2000+ 挑战