原文: https://www.programiz.com/c-programming/c-unions

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

联合是用户定义的类型,与 C 中的结构相似,但有一个键差异。 结构分配足够的空间来存储其所有成员,而联合则分配空间来仅存储最大的成员。


如何定义联合?

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

  1. union car
  2. {
  3. char name[50];
  4. int price;
  5. };

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


创建联合变量

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

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

  1. union car
  2. {
  3. char name[50];
  4. int price;
  5. };
  6. int main()
  7. {
  8. union car car1, car2, *car3;
  9. return 0;
  10. }

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

  1. union car
  2. {
  3. char name[50];
  4. int price;
  5. } car1, car2, *car3;

在这两种情况下,都创建类型为union car的联合变量car1car2和联合指针car3


访问联合成员

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

在上面的示例中,

  • 要访问car1price,请使用car1.price
  • 要使用car3访问price,可以使用(*car3).pricecar3->price

联合与结构之间的区别

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

  1. #include <stdio.h>
  2. union unionJob
  3. {
  4. //defining a union
  5. char name[32];
  6. float salary;
  7. int workerNo;
  8. } uJob;
  9. struct structJob
  10. {
  11. char name[32];
  12. float salary;
  13. int workerNo;
  14. } sJob;
  15. int main()
  16. {
  17. printf("size of union = %d bytes", sizeof(uJob));
  18. printf("\nsize of structure = %d bytes", sizeof(sJob));
  19. return 0;
  20. }

输出

  1. size of union = 32
  2. size of structure = 40

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

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

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

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

使用联合,所有成员共享相同的内存


示例:访问联合成员

  1. #include <stdio.h>
  2. union Job {
  3. float salary;
  4. int workerNo;
  5. } j;
  6. int main() {
  7. j.salary = 12.3;
  8. // when j.workerNo is assigned a value,
  9. // j.salary will no longer hold 12.3
  10. j.workerNo = 100;
  11. printf("Salary = %.1f\n", j.salary);
  12. printf("Number of workers = %d", j.workerNo);
  13. return 0;
  14. }

输出

  1. Salary = 0.0
  2. Number of workers = 100

要了解在哪里使用联合,请访问为什么我们需要 C 联合?