在本教程中,您将掌握 C 语言中联合体的所有知识,它与结构体非常相似。您将涵盖如何定义和访问联合体、联合体与结构体的区别等主题,并附有非常简单的示例。
联合体是 C 语言中一种用户定义的类型,就像结构体一样,它收集单个或不同的数据类型。与结构体一样,联合体也有一个特定的名称,并以数据元素作为其成员。
语法:
定义的原型是
union union_name
{
data_type member_1;
data_type member_2;
...
...
data_type member_n;
};
其中 `union` 是一个关键字,它通知编译器程序中定义了一个联合体。`union_name` 代表联合体的特定名称,用于声明此特定类型的基本变量。`member_1`、`member_2`、...、`member_n` 是相同或不同数据类型的联合体成员。联合体成员必须在花括号 `{}` 内声明,并以分号 (`;`) 结尾。最后但同样重要的是,联合体定义必须在右花括号后立即以分号结束。
下面是联合体定义的示例
union employee
{
int id_no;
char name[20];
float salary;
};
这就是我们定义联合体的方式。这里 `employee` 是一个联合体,包含 3 个不同的成员:整数数据类型的 `id_no`、字符数据类型的 `name` 和浮点数数据类型的 `salary`。
请记住,仅定义不会为联合体保留任何内存。要使联合体处于活动状态并对其进行操作,我们需要声明其变量。变量声明可以有两种方式:
union union_name
{
data_type member_1;
data_type member_2;
...
...
data_type member_n;
}var_1, var_2;
这是示例
union employee
{
int id_no;
char name[20];
float salary;
}emp_1,emp_2;
union union_name var_1,var_2;
这是示例
int main()
{
union employee emp_1,emp_2;
}
在这两种情况下,我们都声明了两个变量 emp_1 和 emp_2。
联合体看起来与结构体非常相似,但关键区别在于,一个联合体不能同时使用多个成员变量。这是因为联合体的所有成员变量共享相同的空间。更具体地说,当声明一个联合体变量时,编译器将分配占用最大空间的变量的空间。其余变量将在需要时共享该空间。
这里有一个简单的演示

当声明 `emp_1` 时,编译器将为变量 `name[20]` 分配空间,因为它占用更多空间,即 20 字节内存。其余的 `id_no` 和 `salary` 将从这 20 字节中共享所需的 4 字节空间。
就像结构体一样,联合体的成员变量通过成员访问运算符或点运算符 (.) 来访问,联合体的指针变量通过箭头指针 (->) 来访问。成员变量的名称作为下标,在联合体变量名后提及,后跟一个句点。
var_1.member_1;
var_1.member_2;
访问成员变量时要记住的关键点是,我们一次只能访问一个成员。让我们看看如果我们尝试同时访问多个变量会发生什么。
#include <stdio.h>
#include <string.h>
union Employee
{
char name[20];
int id;
float salary;
};
int main()
{
union Employee emp_1,emp_2;
// assigning values to emp_1 union variable at a time
strcpy(emp_1.name, "TOM");
emp_1.id = 1001;
emp_1.salary = 8000;
printf("Employee 1 Details \n");
printf("----------------------\n");
printf(" Name : %s \n", emp_1.name);
printf(" ID : %d\n", emp_1.id);
printf(" Salary : %f \n\n", emp_1.salary);
// assigning values to emp_2 union variables one after other
printf("Employee 2 Details\n");
printf("----------------------\n");
strcpy(emp_2.name, "Jerry");
printf(" Name : %s \n", emp_2.name);
emp_2.id = 1002;
printf(" ID : %d\n", emp_2.id);
emp_2.salary = 9000;
printf(" Salary : %f \n", emp_2.salary);
return 0;
}
输出将是
Employee 1 Details ---------------------- Name : ID : 1174011904 Salary : 8000.000000 Employee 2 Details ---------------------- Name : Jerry ID : 1002 Salary : 9000.000000
解释:当您观察输出时,您会发现 emp_1 联合体变量只产生了正确的 salary 输出,而其余成员产生了损坏的输出。导致此损坏的原因是,由于成员共享公共内存空间,因此分配的最后一个成员值将存储在内存中,从而产生正确的输出。另一方面,emp_2 联合体变量在我们为每个成员赋值后立即打印它们时,打印出了正确的成员值。
下表列出了 C 语言中联合体和结构体的关键区别。
| 联合体 | 结构体 |
|---|---|
| 联合体使用关键字 **‘union**’ 定义。 | 结构体使用关键字 **‘struct**’ 定义。 |
| 联合体对象的大小 将始终等于其最大数据成员的大小。 | 结构体对象的大小 将是其数据成员大小的总和。 |
| 联合体成员共享公共内存位置。 | 结构体成员拥有自己唯一的内存位置。 |
| 联合体内存效率更高 | 结构体内存效率较低 |
| 分配给最后一个成员的值将存储在共享内存中 | 分配给所有成员的值将存储在它们各自的内存中。 |
| 一次只能访问一个成员。 | 一次可以访问所有成员。 |
语法
|
语法
|
示例
|
示例
|