联合


2021年8月23日, Learn eTutorial
2157

在本教程中,您将掌握 C 语言中联合体的所有知识,它与结构体非常相似。您将涵盖如何定义和访问联合体、联合体与结构体的区别等主题,并附有非常简单的示例。

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`。
 

如何声明联合体

请记住,仅定义不会为联合体保留任何内存。要使联合体处于活动状态并对其进行操作,我们需要声明其变量。变量声明可以有两种方式:

  1. 在联合体定义期间 

    
    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;  
    
     
    
  2. 在 main() 函数中使用 union 关键字

    
    union union_name var_1,var_2;
     
    

    这是示例

    
    int main()
    {
    union employee emp_1,emp_2;
     }
    
     
    

在这两种情况下,我们都声明了两个变量 emp_1 和 emp_2。

联合变量的内存分配

联合体看起来与结构体非常相似,但关键区别在于,一个联合体不能同时使用多个成员变量。这是因为联合体的所有成员变量共享相同的空间。更具体地说,当声明一个联合体变量时,编译器将分配占用最大空间的变量的空间。其余变量将在需要时共享该空间。

这里有一个简单的演示

building blocks of object oriented programming

当声明 `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**’ 定义。
联合体对象的大小 将始终等于其最大数据成员的大小。 结构体对象的大小 将是其数据成员大小的总和。
联合体成员共享公共内存位置。 结构体成员拥有自己唯一的内存位置。
联合体内存效率更高 结构体内存效率较低
分配给最后一个成员的值将存储在共享内存中 分配给所有成员的值将存储在它们各自的内存中。
一次只能访问一个成员。 一次可以访问所有成员。
语法

union union_name
{
    data_type member_1;
    data_type member_2;
    ...
    ...
    data_type member_n;
};
 
语法

struct struct_name
{
    data_type member_1;
    data_type member_2;
    ...
    ...
    data_type member_n;
};
 
示例

union Employee
{
   char name[20]; // 20 bytes
   int id;        // 4 bytes
   float salary;  // 4 bytes
};
//union object size is 20 bytes
 
示例

struct Employee
{
   char name[20]; // 20 bytes
   int id;        // 4 bytes
   float salary;  // 4 bytes
};
// structure object size is 28 bytes.