C语言允许相同的存储区域由许多不同的变量共享。可以使用union
类型来进行内存共享。声明union
的语法类似于结构。通常以相同的方式为联合体提供标记名称。
可以使用关键字union
来定义联合体。例如,以下语句声明一个由三个变量共享的联合体:
union MyUnion
{
float my_Float;
int *pnum;
double my_value;
} u1;
此语句声明了一个名称为:MyUnion
的联合体,一个浮点值:my_Float
,一个指向整数pnum
的指针和一个双精度浮点变量my_value
之间共享内存。
该语句定义了一个变量名为u1
的union
实例。可使用如下语句声明此联合体的其他实例:
union MyUnion u2, u3;
要为u1
和u2
的成员分配值,可以这样写:
u1.my_Float = 2.5;
u2.my_Float = 3.5*u1.my_Float;
union
的实例的大小是最大成员所需的内存大小。
访问联合体成员
同样,可以以与结构类似的方式访问联合体成员。在上面的示例中,假设要访问union
变量car1
的price
成员,可以使用以下语句:
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
的所有其他成员,即salary
,workerNo
,将包含垃圾值。
但是,当用户输入salary
的值时,1234.23
将存储在job1.salary
中,而其他成员,即name
,workerNo
,现在将包含垃圾值。因此,在输出中,salary
打印准确,但name
显示一些随机字符串。