C语言 联合体

  • 联合体

    联合体是在C语言中的特殊数据类型,它允许不同的数据类型储存在同一存储器位置。您可以定义具有多个成员的联合,但是在任何给定时间只能有一个成员包含一个值。联合提供了一种将相同内存位置用于多种用途的有效方法。
  • 定义联合体

    要定义联合体,必须以与定义结构体时相同的方式使用union语句。union语句为您的程序定义了一个新数据类型,该数据类型具有多个成员。联合体声明的格式如下-
    
    union [union tag] {
       member definition;
       member definition;
       ...
       member definition;
    } [one or more union variables];  
    
    union tag是可选的,并且每个部件定义是一个正常的变量定义,例如int i; 或float f; 或任何其他有效的变量定义。在并集定义的末尾,在最后一个分号之前,您可以指定一个或多个并集变量,但这是可选的。
    这是定义具有三个成员i,f和str的名为Data的union类型的方式-
    
    union Data {
       int i;
       float f;
       char str[20];
    } data;   
    
    现在,Data类型的变量可以存储整数,浮点数或字符串。这意味着可以使用单个变量(即相同的存储位置)来存储多种类型的数据。您可以根据需要在联合体内使用任何内置或用户定义的数据类型。 union占用的内存将足以容纳union中的最大成员。例如,在上面的示例中,数据类型将占用20个字节的内存空间,因为这是字符串可以占用的最大空间。以下示例显示上述联合占用的总内存大小-
    
    #include <stdio.h>
    
    #include <string.h>
     
    union Data {
       int i;
       float f;
       char str[20];
    };
     
    int main( ) {
    
       union Data data;        
    
       printf( "Memory size occupied by data : %d\n", sizeof(data));
    
       return 0;
    }
    
    尝试一下
  • 访问联合体成员

    要访问工会的任何成员,我们使用成员访问运算符(.)。成员访问运算符被编码为联合变量名称和我们希望访问的联合成员之间的句点。您将使用关键字union定义联合类型的变量。以下示例显示如何在程序中使用联合-
    
    #include <stdio.h>
    #include <string.h>
    
    union Data {
       int i;
       float f;
       char str[20];
    };
     
    int main( ) {
    
       union Data data;        
    
       data.i = 10;
       data.f = 220.5;
       strcpy( data.str, "C Programming");
    
       printf( "data.i : %d\n", data.i);
       printf( "data.f : %f\n", data.f);
       printf( "data.str : %s\n", data.str);
    
       return 0;
    }
    
    尝试一下
    这里,我们可以看到union的i和f成员的值被破坏了,因为分配给变量的最终值占用了内存位置,这就是为什么str成员的值正确打印的原因。现在让我们再看一遍同样的例子,我们一次只使用一个变量,这是使用union的主要目的
    
    union Data {
       int i;
       float f;
       char str[20];
    };
     
    int main( ) {
    
       union Data data;        
    
       data.i = 10;
       printf( "data.i : %d\n", data.i);
       
       data.f = 220.5;
       printf( "data.f : %f\n", data.f);
       
       strcpy( data.str, "C Programming");
       printf( "data.str : %s\n", data.str);
    
       return 0;
    }
    
    尝试一下
    在这里,所有成员都能正确打印,因为一次只使用一个成员。