结构体(Struct)是一种构造类型或复杂类型,它可以包含多个类型不同的成员。在C++中,还有另外一种和结构体非常类似的语法,叫做共用体(Union)。

1、定义声明

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

union 共用体名{
成员列表
};

例如,

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

1)共用体也是一种自定义类型,可以通过它来创建变量

例如,

union data{
    int n;
    char ch;
    double f;
};
union data a, b, c;

2)定义共用体的同时创建变量

union data{
    int n;
    char ch;
    double f;
} a, b, c;

3)如果不再定义新的变量,也可以将共用体的名字省略

union{
    int n;
    char ch;
    double f;
} a, b, c;

例如,

#include <iostream>
using namespace std;
union data{
    int n;
    char ch;
    short m;
};
int main(){
    union data a;
    printf("%d, %d\n", sizeof(a), sizeof(union data) );
    a.n = 0x40;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.ch = '9';
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.m = 0x2059;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    a.n = 0x3E25AD54;
    printf("%X, %c, %hX\n", a.n, a.ch, a.m);
    return 0;
}

2、访问共用体成员

访问共用体的成员,需要使用成员访问运算符(.)。

例如,

#include <iostream>
using namespace std;
#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/C++ 语言");
   cout << "data.i : " <<  data.i << endl;
   cout << "data.f : " <<  data.f << endl;
   cout << "data.str : " << data.str << endl;
   return 0;
}

上面示例的输出结果中,共用体的 i 和 f 成员的值有损坏,因为最后赋给变量的值占用了内存位置,这也是 str 成员能够完好输出的原因。

共用体是任何时候只能有一个成员带有值。同一时间应该只用一个成员。

例如,

#include <iostream>
using namespace std;
#include <string.h>
union Data
{
   int i;
   float f;
   char  str[20];
};
int main( )
{
   union Data data;        
   data.i = 10;
   cout <<  "data.i :  " <<  data.i << endl;
   data.f = 220.5;
   cout << "data.f :  " << data.f << endl;
   strcpy( data.str, "C/C++ 语言");
   cout << "data.str :  " <<  data.str << endl;
   return 0;
}

推荐文档