C 语言中的联合体

与 结构体 (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;
}
Union in C programming

在这个 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);