共用体把几种不同数据类型的变量存放在同一块内存里。共用体中的变量共享同一块内存。
定义共用体类型变量的一般形式:
union 共用体名
{
成员列表
}变量列表;
与结构体类似,变量列表是可选的。如果没有变量列表,只是定义了一种共用体类型。
union data
{
int i;
char c;
double d;
};
union data a;
a.i=100;
a.c='A';
此时共用体变量a中的成员i已经没有值了,因为存储该值的内存现在已经被用来存储成c的值了。同一块内存可以用来存放几种不同类型的数据,但在某个时刻只能在其中存放一个成员变量。共用体变量中起作用的成员是最后一次存入的数据。共用体变量的长度取决于其成员的最大长度。
结构体变量所占内存的长度是各个成员的总和,每个成员分别占有自己的存储空间。共用体变量所占内存的长度是其最长成员的长度。
不能把共用体变量作为函数参数,也不能使函数返回共用体变量。
共用体的应用场景
(1)通信中的数据包会用到共用体,因为不知道对方会发送什么样的数据包过来,用共用体的话就简单了,定义几种格式的包,收到包之后就可以根据包的格式取出数据。
(2)节约内存。如果有2个很长的数据结构,但不会同时使用,比如一个表示老师,一个表示学生,要统计老师和学生的情况,用结构体就比较浪费内存,这时就可以考虑用共用体来设计。
(3)某些应用需要大量的临时变量,这些变量类型不同,而且会随时更换。而你的堆栈空间有限,不能同时分配那么多临时变量。这时可以使用共用体让这些变量共享同一个内存空间,这些临时变量不用长期保存,用完即丢,和寄存器差不多,不用维护。