union,C语言中使用比较少的一个东西,其实并不复杂。本质上来说,他和结构体是一样的,只是在包装角度看有些差异。
形式
union 共用体名{
数据类型 成员名;
数据类型 成员名;
...
}变量名;
特点
1.共用体表示几个变量共用一个内存位置,在不同的时间保存不同的数据类型和不同长度的变量。在union中,所有的共用体成员共用一个空间,并且同一时间只能储存其中一个成员变量的值。
2.union中可以定义多个成员,union的大小由最大的成员的大小决定。
3.对某一个成员赋值,会覆盖其他成员的值。
当成员所占字节数不同时,只会覆盖相应字节上的值。例:char只占1个字节,而int占4个字节,则char类型数据只会覆盖int类型数据的低地址1字节。
4.联合体union的存放顺序是所有成员都从低地址开始存放的。
比如0x1234中,0x12是高地址,而0x34是低地址。
实例
有如下一段程序:
#include <stdio.h>
main()
{
union
{
char c;
int i;
float a;
}test;
test.i=0x1234;
test.c='A';
printf("%x\n",test.i);
}
程序运行结果:1241
程序中先给i赋值,再给c赋值,因为i为int类型,而c为char类型,所以,当在给c赋值之后,会赋值原来已有的i的值,但又不足以完全覆盖,从而得到运行结果。
与结构体区别
1. 共用体和结构体都是由多个不同的数据类型成员组成, 但在任何同一时刻, 共用体只存放了一个被选中的成员, 而结构体的所有成员都存在。
2. 对于共用体的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。
扩展
union的赋值操作涉及到数据所占字符大小的问题,以下是在32位操作系统下的部分数据类型所占字节:
1:整形
int 4字节
longint 4字节
shortint 2字节
unsignedint 4字节
unsignedlong int 4字节
unsignedshort int 2字节
2:字符型
char 1字节
unsignedchar 1字节
3:浮点型
float 4字节
double 8字节
longdouble 8字节
unsigned longdouble 8字节
unsigneddouble 4字节
4:字符串型
string 32字节
5:指针类型
所有类型的指针都是 4字节
......