C 共用体

本文介绍了 C 语言的共用体,包括创建共用体、访问共用体成员以及共用体和结构体之间的差异。

在 C 语言中,共用体也是一种用户定义的类型,类似于结构体。但是,共用体和结构体有一个关键的区别:结构分配足够的内存空间来存储其所有成员,而共用体所有成员共用一个内存空间,一次只能保存一个成员值。

如何定义共用体?

我们使用 union 关键字来定义共用体。下面创建了一个共用体 car

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
  • (*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("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

为什么共用体变量和结构变量的大小存在这种差异?

这里,结构体的大小是 40 个字节,因为

  • name[32] 的大小为 32 字节
  • salary 的大小为 4 个字节
  • workerNo 的大小为 4 个字节

然而,共用体的大小是 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