union称为共用体,也叫联合体,在一个“联合”内可以定义多种不同的数据类型, 一个被说明为该“联合”类型的变量中,允许装入该“联合”所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。union变量所占用的内存长度等于最长的成员的内存长度。
例如,把一个整型变量、一个字符型变量,一个双精度型变量放在同一个地址开始的内存单元中:
一、联合体的定义
定义一个联合体类型的一般形式为:
union 联合体名
{
成员表
};
成员表中含有若干成员,成员的一般形式为: 类型说明符 成员名
成员名的命名应符合标识符的规定。
例如:
union perdata
{
int Class;
char Office;
};
定义了一个名为perdata的联合体类型,它含有两个成员,一个为整型,成员名为Class;另一个为字符,字符名为Office。联合体定义之后,即可进行联合体变量声明,被声明为perdata类型的变量,可以存放整型量Class或存放字符型的变量Office。
二、联合变量的声明
联合体变量的声明和结构变量的声明方式相同,也有三种形式。即先定义,再声明;定义同时声明和直接声明。
以perdata类型为例,声明如下:
union perdata
{
int Class;
char Office;
};
union perdata a,b;
或者可同时说明为:
union perdata
{
int Class;
char Office;
}a,b;
或直接说明为:
union
{
int Class;
char Office;
}a,b;
经说明后的a,b变量均为perdata类型。a,b变量的长度应等于 perdata 的成员类型中最长的长度,即等于Class的长度,共4个字节。a,b变量如赋予整型值时,只使用了4个字节,而赋予字符时,可用1个字节。
三、union应用实例
1、试验实例
#include <iostream>
using namespace std;union test
{char mark;long num;float score;
}a;int main()
{// cout<<a<<endl; // wronga.mark = 'b';cout<<a.mark<<endl; // 输出'b'cout<<a.num<<endl; // 98 字符'b'的ACSII值cout<<a.score<<endl; // 输出错误值a.num = 10;cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正cout<<a.num<<endl; // 输出10cout<<a.score<<endl; // 输出错误值a.score = 10.0;cout<<a.mark<<endl; // 输出空cout<<a.num<<endl; // 输出错误值cout<<a.score<<endl; // 输出10return 0;
}
2、测试CPU是大端模式还是小端模式
#include <iostream>
using namespace std;void checkCPU()
{union MyUnion{int a;char c;}test;test.a = 1;if (test.c == 1)cout << "little endian" <<endl;else cout << "big endian" <<endl;
}int main()
{checkCPU();return 0;
}
四、union与struct比较
在结构中各成员有各自的内存空间,一个结构体变量的总长度大于等于各成员长度之和。而在“联合”中,各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度。应该说明的是,这里所谓的共享不是指把多个成员同时装入一个联合变量内,而是指该联合变量可被赋予任一成员值,但每次只能赋一种值,赋入新值则冲去旧值。如上面介绍的“单位”变量,定义为一个可装入“班级”或“教研室”的联合后,就允许赋予整型值(班级)或字符型(教研室)。要么赋予整型值,要么赋予字符型,不能把两者同时赋予它。联合类型的定义和联合变量的说明:一个联合类型必须经过定义之后,才能把变量说明为该联合类型。
比较图示:
比较测试:
struct student
{char mark;long num;float score;
};
其struct的内存结构如下,sizeof(struct student)的值为12bytes。
union test
{char mark;long num;float score;
};
sizeof(union test)的值为4。因为共用体将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中,而char类型和long类型所占的内存字节数是不一样的,但是在union中都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。