Skip to content

Latest commit

 

History

History
158 lines (108 loc) · 3.12 KB

42.md

File metadata and controls

158 lines (108 loc) · 3.12 KB

C 联合

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

在本教程中,您将学习 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 联合?