欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言之联合体Union

程序员文章站 2022-07-15 08:53:35
...

C语言之联合体Union

共用体是一种特殊的数据类型,允许您在相同的内存位置存储不同的数据类型。您可以定义一个带有多成员的共用体,但是任何时候只能有一个成员带有值。共用体提供了一种使用相同的内存位置的有效方式。

定义共用体Union

为了定义共用体,您必须使用 union 语句,方式与定义结构类似。union 语句定义了一个新的数据类型,带有多个成员。union 语句的格式如下:

union [union tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more union variables];

union tag 是可选的,每个 member definition 是标准的变量定义,比如 int i; 或者 float f; 或者其他有效的变量定义。在共用体定义的末尾,最后一个分号之前,您可以指定一个或多个共用体变量,这是可选的。

下面定义一个名为 Data 的共用体类型,有三个成员 i、f 和 str:

union Data
{
   int i;
   float f;
   char  str[20];
} data;

现在,Data 类型的变量可以存储一个整数、一个浮点数,或者一个字符串。这意味着一个变量(相同的内存位置)可以存储多个多种类型的数据。您可以根据需要在一个共用体内使用任何内置的或者用户自定义的数据类型。

共用体占用的内存应足够存储共用体中最大的成员。例如,在上面的实例中,Data 将占用 20 个字节的内存空间,因为在各个成员中,字符串所占用的空间是最大的

访问共用体成员

为了访问共用体的成员,我们使用成员访问运算符(.)。成员访问运算符是共用体变量名称和我们要访问的共用体成员之间的一个句号。您可以使用 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;
 //对共用体的正确操作
   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;
 
}

当上面的代码被编译和执行时,它会产生下列结果:

//错误操作的结果
data.i : 1917853763
data.f : 4122360580327794860452759994368.000000
data.str : C Programming
//正确操作的结果
data.i : 10
data.f : 220.500000
data.str : C Programming

小结:

共用体的定义和结构体类似,但是本质是对同一款内存的不同操作方式,因为是同一块内存的同一时刻只可以给一个变量使用,所以在使用时切记同一时间只能使用共用体中的一个成员!

注:

结构体变量所占内存长度是其中最大字段大小的整数倍

共用体变量所占的内存长度等于最长的成员变量的长度。例如,教程中定义的共用体Data各占20个字节(因为char str[20]变量占20个字节),而不是各占4+4+20=28个字节。

union Data   //占20个字节
{
   int i;
   float f;
   char  str[20]; //char str[20]变量占20个字节
} data;  

union Data{   //占16个字节
    int i;
    float f;
    char str[9];  //占9个字节
    double d;     //占16个字节
}data;

编程时经常会需要判断机器是大端机还是小端机,此时使用union就非常方便:

union
{
    char str;
    int data;
};
data=0x01020304;
if(str==0x01)
{
    cout<< "此机器是大端!"<<endl;
}
else if(str==0x04){
    cout<<"此机器是小端!"<<endl;
}
else{
    cout <<" 暂无法判断此机器类型!"<<endl;
}