# C 联合

> 原文： [https://www.programiz.com/c-programming/c-unions](https://www.programiz.com/c-programming/c-unions)

#### 在本教程中，您将学习 C 编程中的联合。 更具体地说，如何创建联合，访问其成员以及了解联合与组织之间的差异。

联合是用户定义的类型，与 C 中的[结构](/c-programming/c-structures)相似，但有一个键差异。 结构分配足够的空间来存储其所有成员，而联合则分配空间来仅存储最大的成员。

* * *

## 如何定义联合？

我们使用`union`关键字定义联合。 这是一个例子：

```c
union car
{
  char name[50];
  int price;
};

```

上面的代码定义了派生类型`union car`。

* * *

## 创建联合变量

定义联合后，它将创建用户定义的类型。 但是，没有分配内存。 要为给定的联合类型分配内存并使用它，我们需要创建变量。

这是我们创建联合变量的方法。

```c
union car
{
  char name[50];
  int price;
};

int main()
{
  union car car1, car2, *car3;
  return 0;
}

```

创建联合变量的另一种方法是：

```c
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`。

* * *

## 联合与结构之间的区别

让我们以一个例子来说明联合与结构之间的区别：

```c
#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;
} 
```

**输出**

```c
size of union = 32
size of structure = 40

```

**为什么联合和结构变量的大小存在差异？**

这里，`sJob`的大小为 40 个字节，因为

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

但是，`uJob`的大小为 32 个字节。 这是因为联合变量的大小将始终是其最大元素的大小。 在上面的示例中，其最大元素（`name[32]`）的大小为 32 个字节。

使用联合，所有成员共享**相同的内存**。

* * *

### 示例：访问联合成员

```c
#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;
}
```

**输出**

```c
Salary = 0.0
Number of workers = 100

```

* * *

要了解在哪里使用联合，请访问[为什么我们需要 C 联合？](https://stackoverflow.com/questions/252552/why-do-we-need-c-unions)