juliusun.com
第 38/50 节 冥河C语言教程
共用体,也称为联合体,由相同或不同类型的多个成员组成,所有成员共用一块内存。
占用空间最大的单个成员,使用的内存大小,就是共用体占用空间大小。
为了避免不必要的风险,写入和读取最好使用同一成员。
有时候,我们需要记录多个信息,但是这些信息同时只会使用一种。如果我们定义多个变量或一个结构体,在使用其中一个变量或成员时,其它的变量或成员虽然没有使用,但是仍然占据着空间。这时用共用体就比较合适了。定义一个共用体,里面有多个成员,我们只需要使用其中一种成员即可。由于是成员共用一块内存,减少了内存浪费。
假设一个店铺,需要记录关于员工及顾客的某些信息,记录int类型员工号和float类型顾客消费金额。
顾客是没有员工号的,员工也不会产生消费金额,所以定义两个变量,或是一个结构体两个成员。占用两份内存却只使用一份,内存是浪费明显。如果定义一个变量,类型又需要相互转换。用共用体,即可以产生两个数据类型,又共用空间,由于int和float类型都占用4个字节,内存不会浪费,非常合适。以下代码以此为例。
共用体与结构体类似,定义分成两步:1、定义共用体类型;2、定义共用体变量
共用体类型定义格式如下:
union 共用体类型名
{
类型 成员1;
类型 成员2;
……
类型 成员N;
};
例:
共用体变量定义格式如下:
union 共用体类型名 共用体变量名
例:
共用体变量可以在定义时赋值,也可以先定义后赋值。定义时赋值,或称初始化,只能给出一个成员的值。
例:
系统会根据给出初始化值类型,按照其对应的类型,来完成共用体赋值。
如上例。发现m初始值为1234,是个整数,就按整数类型存储共用体,此时由于id成员是整型,可以正常使用了。float成员由于存储格式与int类型不同,使用时可能无法达到预定效果。
如果有多个成员类型相同,那就无所谓了,反正类型相同,占用空间大小及内存存储格式相同,又共用一块内存,使用哪个都不会出错。
不同类型成员。由于存储格式、占用空间大小等情况不一样,虽然共用一块内存,表示的值是不一样的。如m值为1234,id由于是int类型,值是正常的。但是float存储格式是另一种方式,所以用来表示float时并不是1234.0,是多少现在不用理会,有兴趣可以了解计算机底层。
如果成员占用空间大小都不一样,表示的值可能也会偏离本意,本节不细究。
变量定义时赋值,用花括号{}括起成员,把成员按定义顺序依次给出,用逗号分隔。
引用成员格式是共用体变量名后面跟点.运算符再接成员名,即:
共用体变量名 . 成员名
例:
共用体类型和变量定义、初始化值也可以写在一起,很容易想到,格式应为:
union 共用类型名 { 类型 成员1; 类型 成员2; …… 类型 成员N; }共用体变量1={初始值1},共用体变量2={初始值2},……,共用体变量N={初始值N};
举个例子熟悉下:
输入y时效果图类似如下:
输入非y如n时效果图类似如下: