易百教程

联合体

C语言允许相同的存储区域由许多不同的变量共享。可以使用union类型来进行内存共享。声明union的语法类似于结构。通常以相同的方式为联合体提供标记名称。
可以使用关键字union来定义联合体。例如,以下语句声明一个由三个变量共享的联合体:

union MyUnion
{
  float my_Float;
  int *pnum;
  double my_value;
} u1;

此语句声明了一个名称为:MyUnion的联合体,一个浮点值:my_Float,一个指向整数pnum的指针和一个双精度浮点变量my_value之间共享内存。

该语句定义了一个变量名为u1union实例。可使用如下语句声明此联合体的其他实例:

union MyUnion u2, u3;

要为u1u2的成员分配值,可以这样写:

u1.my_Float = 2.5;
u2.my_Float = 3.5*u1.my_Float;

union的实例的大小是最大成员所需的内存大小。

访问联合体成员

同样,可以以与结构类似的方式访问联合体成员。在上面的示例中,假设要访问union变量car1price成员,可以使用以下语句:

car1.price

同样,如果要访问联合体car3指针变量price,可以这样访问它:

(*car3).price
// 或者
car3->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", sizeof(uJob));
   printf("\nsize of structure = %d", sizeof(sJob));
   return 0;
}

执行上面示例代码,得到以下结果:

size of union = 32
size of structure = 40

1. 结构体比联合体需要更多内存

如上例所示,结构体比联合体之间的内存分配存在差异。存储结构体变量所需的内存量是所有成员的内存大小之和。

但是,存储union变量所需的内存是union的最大元素所需的内存。

一次只能访问一个联合体成员,在结构体的情况下,可以随时访问其所有成员。
但是,在union的情况下,一次只能访问其中一个成员,而所有其他成员都将包含垃圾值。

#include <stdio.h>
union job
{
   char name[32];
   float salary;
   int workerNo;
} job1;

int main()
{
   printf("Enter name:\n");
   scanf("%s", &job1.name);

   printf("Enter salary: \n");
   scanf("%f", &job1.salary);

   printf("Displaying\nName :%s\n", job1.name);
   printf("Salary: %.1f", job1.salary);

   return 0;
}

执行上面示例代码,得到以下结果:

Enter name 
Hillary
Enter salary
1234.23
Displaying
Name: f%Bary   
Salary: 1234.2

注意: name成员的值可能是不同的垃圾值或空字符串。最初在程序中,Hillary存储在job1.name中,job1的所有其他成员,即salaryworkerNo,将包含垃圾值。
但是,当用户输入salary的值时,1234.23将存储在job1.salary中,而其他成员,即nameworkerNo,现在将包含垃圾值。因此,在输出中,salary打印准确,但name显示一些随机字符串。