union主要是将各种类型的数据存放在一段固定的存储器中,存储器的大小由union中需要最大存储器的数据类型决定。
union student{
char ***;
int age;
long number;
double score;
};
其中long、double需要16个字节,而char只需要1个字节,因此该共用体占用16个字节,union的关键是不同的数据类型共用存储器。
实例:
1、确定CPU的模式:大、小端模式确定
大小端不同,则存储方式也存在差别,比如int需要4个字节,而char只需要1个字节,根据一个字节所在的具体位置即可判定CPU的模式
union CPU
{
int i;
char ch;
};
void testCPUMode(void)
{
union CPU Test;
Test.i = 1;
if(Test.ch == 1)
{
//小端模式
}
else
{
//大端模式
}
}
2、实现不同数据之间的类型转换
各种类型的数据共用存储空间,很方便的实现了不同数据类型之间的转换,不需显示的强制类型转换。
struct register{
char a;
char b;
char c;
char d;
};
union Register
{
struct register;
int whole;
};
3、寄存器的定义,实现整体访问及单项访问
struct register{
char a;
char b;
char c;
char d;
};
union Register
{
struct register;
int whole;
};
能实现单项和整体的访问,在引入位域操作等相关结构以后,可实现每个bit的访问。
union UnionData { /*定义一个 共用体*/
int num;
struct { /*在 共用体 中定义一个结构*/
char first;
char second;
} sChar;
} uData;
//共用体 成员赋值
// 赋值给num 0x4241,由于共用内存,也相当对first赋值0x41,second赋值0x42
// 由ascii码表得:first='A' second='B'
uData.num=0x4241;
cout << "uData.sChar.first="<< uData.sChar.first << " uData.sChar.second=" << uData.sChar.second << endl;
实例http://blog.csdn.net/sodino/article/details/41599931
通信中的数据包会用到共用体。因为不知道对方会发一个什么包过来,用共用体的话就很简单了,定义几种格式的包,收到包之后就可以直接根据包的格式取出数据。