与 结构体 (Structures) 类似,C 语言编程中的联合体 (Union) 也用于将不同的数据类型组合在一起,以结构化的方式组织数据。系统保留关键字 union 用于在这种编程语言中创建它。
与结构体不同,C 语言中的联合体变量会为其所有成员(如 age、name、address 等)分配一个公共的内存空间。这个分配的公共内存的大小等于联合体中最大成员的大小。因此,我们可以节省大量内存。
由于这个公共内存,我们不能同时访问所有的联合体成员。因为联合体变量一次只保存一个成员,所以我们一次只能访问一个成员。
C 语言联合体语法
它是一个系统保留关键字,用于创建和访问其成员。UName 是你希望为这个联合体指定的名称。例如,employees、persons 和 students。C 语言编程中联合体的基本语法如下所示。
union UName
{
Data_Type Variable_Name; //Member
Data_Type Variable_Name; //Member
………….
};
Data_Type 指的是你想要声明的变量的数据类型。例如,int、float、char 等。而 Variable_Name 是变量的名称。例如,id、age、name 和 salary。例如
union Student //Name = Employee
{
//Members
int Roll_No; //Data Type = int; Variable Name = Roll_No
char name[50]; //Data Type = char Array; Variable Name = name
char address[100]; //Data Type = Char Array; Variable Name = address
};
C 语言编程中联合体的声明
在访问其内部成员之前,我们必须先创建变量。我们可以通过多种方式声明变量。第一种方法是先声明联合体,然后在 main 函数中创建变量。
union Employee
{
int age;
char name[50];
float salary;
};
//Creating the Structure variable
union Employee emp1, emp2;
emp1 = {25, "Dave", 25000}
这里,emp1 和 emp2 是该数据类型的变量。第二种方法是在声明联合体的同时创建编程变量。
union Employee
{
int age;
char name[50];
float salary;
} emp1, emp2;
访问成员
我们可以使用点运算符 (.) 或成员运算符来访问该编程语言中联合体的成员。例如,让我们使用上面的例子。
//Assigning the values emp1.age = 26; strcopy (emp1.name, "Michel"); emp1.salary = 46000.50;
C 语言编程联合体示例
在这个程序中,我们将声明一个包含四个成员的联合体。然后,我们将以两种不同的方式将每个单独的成员作为输出显示。请参考 C 编程中的结构体文章,以理解结构体。
#include <stdio.h>
#include <string.h>
union Employee
{
int age;
char Name[50];
char Department[20];
float Salary;
};
int main()
{
union Employee emp1;
union Employee emp2;
emp1.age = 28;
strcpy(emp1.Name, "Chris");
strcpy(emp1.Department, "Science");
emp1.Salary = 32000.70;
printf("\nDetails of the First Employee \n");
printf(" Employee Age = %d \n", emp1.age);
printf(" Employee Name = %s \n", emp1.Name);
printf(" Employee Department = %s \n", emp1.Department);
printf(" Employee Salary = %.2f \n\n", emp1.Salary);
printf("Details of the Second Employee \n" );
emp2.age = 30;
printf(" Employee Age = %d \n", emp2.age );
strcpy(emp2.Name, "David");
printf(" Employee Name = %s \n", emp2.Name );
strcpy(emp2.Department, "Technology" );
printf(" Employee Department = %s \n ", emp2.Department );
emp2.Salary = 35000.20;
printf(" Employee Salary = %.2f \n ", emp2.Salary );
return 0;
}

在这个 C 联合体示例程序中,我们用适当的数据类型声明了 Employee,其成员包括 age、Name、Department 和 Salary。在 main() 函数中,我们为 Employee 创建了两个变量 emp1 和 emp2。
第一位员工的详细信息。
从下面的语句中,你可以看到变量将为 age 成员分配内存。这意味着值 28 存储在 age 的内存位置 (age = 28)。
emp1.age = 28;
从下面的语句中,你可以观察到联合体变量必须为 Name 成员分配内存。因此,它将删除前一个条目(即 age)的数据。然后,它将相同的内存分配给 Name 成员。这意味着 Chris 将存储在一个内存位置(此处替换了 age)。
strcpy(emp1.Name, "Chris");
现在变量必须为 Department 成员分配内存。因此,它将删除前一个条目(即 Name)的数据。然后,它将相同的内存分配给 Department 成员。这意味着 Science 存储在一个内存位置(此处替换了 Chris)。
strcpy(emp1.Department, "Science");
接下来,C 联合体变量必须为 Salary 成员分配内存。因此,它将删除前一个条目(即 Department)的数据,并将相同的内存分配给 Salary 成员。这意味着 32000.70 存储在内存位置(此处替换了 Science)。
emp1.Salary = 32000.70;
下面的 printf 语句用于输出我们为成员赋的值。以下语句将显示一个错误或奇怪的值,因为 age 的值已经被其他值替换了。
printf(" Employee Age = %d \n", emp1.age);
以下语句将显示一个错误或奇怪的值,因为 Name 的值已经被其他值替换了。
printf(" Employee Name = %s \n", emp1.Name);
下面的联合体语句显示奇怪或错误的值,因为 Department 的值已经被 Salary 替换了。
printf(" Employee Department = %s \n", emp1.Department);
以下语句打印正确的 Salary 值。因为在此之后,我们没有将内存位置分配给其他值。
printf(" Employee Salary = %.2f \n", emp1.Salary);
第二位员工的详细信息。联合体允许我们一次访问一个数据成员。所以在这个变量中,我们将在为该数据成员赋值后立即显示输出。
emp2.age = 30;
printf(" Employee Age = %d \n", emp2.age);
变量将为 age 成员分配内存。这意味着值 28 存储在 age 的内存位置 (age = 28)。赋值后,它立即打印出 age 的输出。
现在 C 联合体变量必须为 Name 成员分配内存。因此,它删除前一个条目(即 age)的数据。然后,它将相同的内存分配给 Name 成员。这意味着 David 存储在一个内存位置(此处替换了 age)。
strcpy(emp2.Name, "David");
printf(" Employee Name = %s \n", emp2.Name);
提示:如果你忘记立即打印语句,数据将被移除并分配给下一个成员。
对于下面的语句,过程是相同的。
strcpy(emp2.Department, "Technology");
printf(" Employee Department = %s \n", emp2.Department);
emp2.Salary = 35000.20;
printf(" Employee Salary = %.2f \n\n", emp2.Salary);