14. 共用体
一、什么是共用体
联合体也称为共用体,它使几种不同类型的变量存放到同一段内存单元中。所以共用体在同一时刻只能有一个值,它属于某一个数据成员。由于所有成员都位于同一块内存,因此共同体的大小至少是最大成员的大小。
结构体与共用体之间的区别在于:结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员值会影响其余所有成员。
二、共用体的声明
定义共用体变量的一般形式如下:
union 联合体名
{
数据类型 成员1;
数据类型 成员2;
...
数据类型 成员n;
};
其中,uinon 关键字表示声明联合体,其后的联合体名表示该联合体的类型名,大括号中的变量构成联合体的成员,也就是一般形式的成员列表;
在声明联合体时,要注意括号最后面有一个分号“;”
三、共用体变量的定义
声明一个联合体体表示的是创建一种新的类型名,需要用新的类型名在定义一个变量。定义的方式有 3 种:
【1】、声明联合体类型,再定义变量
union 联合体类型名 结构体变量;
【2】、在声明联合体时定义变量
union 联合体名
{
数据类型 成员1;
数据类型 成员2;
...
数据类型 成员n;
}变量名1, 变量名2, ..., 变量名n;
定义的变量不是只能有一个,可以定义多个变量;
【3】、直接定义联合体类型变量
如果我们只需要确定个数的联合体变量,后面不需要再使用联合体数据类型定义变量,我们可以在定义时不给出联合体名。
union
{
数据类型 成员1;
数据类型 成员2;
...
数据类型 成员n;
}变量名1, 变量名2, ..., 变量名n;
四、共用体变量的初始化
在定义共同体变量时,可以同时对共用体变量进行初始化操作。初始化的值放在一对大括号中。对共同体变量进行初始化时,只需要一个初始化值就足够了,其类型需要和共用体的第一个成员的类型一致。如果共用体的第一个成员是一个结构体类型,则初始化值可以包含多个用于初始化该结构体的表达式。
五、共用体变量的引用
定义联合体之后,就可以引用其中的成员数据进行使用。引用的一般形式为:
联合体变量.成员名
不能直接引用共用体变量;
#include <stdio.h>
union data
{
int n;
char ch;
short s;
};
int main()
{
union data a = {100};
printf("%d %d\n",sizeof(a),sizeof(int));
printf("%d %c %d\n",a.n,a.ch,a.s);
a.ch = 'a';
printf("%d %c %d\n",a.n,a.ch,a.s);
a.s = 50;
printf("%d %c %d\n",a.n,a.ch,a.s);
return 0;
}
六、共用体类型的数据特点
- 同一个内存段可以用来存放几种不同类型的成员,但是每一次只能存放其中一种,而不是同时存放所有的类型。也就是说,在共用体种,只有一个成员起作用,其它成员不起作用。
- 共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有的成员就失去作用。
- 共用体变量的地址和它的各成员的地址是一样的。
- 共用体变量不能作函数参数,也不能作函数的返回值。
- 不能对共用体变量名赋值,也不能引用变量名来得到一个值。