惧留孙网

juliusun.com

在线教程 > C语言教程 > 共用体

共用体

第 38/50 节 冥河C语言教程


共用体,也称为联合体,由相同或不同类型的多个成员组成,所有成员共用一块内存。

占用空间最大的单个成员,使用的内存大小,就是共用体占用空间大小。

为了避免不必要的风险,写入和读取最好使用同一成员。

有时候,我们需要记录多个信息,但是这些信息同时只会使用一种。如果我们定义多个变量或一个结构体,在使用其中一个变量或成员时,其它的变量或成员虽然没有使用,但是仍然占据着空间。这时用共用体就比较合适了。定义一个共用体,里面有多个成员,我们只需要使用其中一种成员即可。由于是成员共用一块内存,减少了内存浪费。

假设一个店铺,需要记录关于员工及顾客的某些信息,记录int类型员工号和float类型顾客消费金额。

顾客是没有员工号的,员工也不会产生消费金额,所以定义两个变量,或是一个结构体两个成员。占用两份内存却只使用一份,内存是浪费明显。如果定义一个变量,类型又需要相互转换。用共用体,即可以产生两个数据类型,又共用空间,由于int和float类型都占用4个字节,内存不会浪费,非常合适。以下代码以此为例。

共用体与结构体类似,定义分成两步:1、定义共用体类型;2、定义共用体变量

共用体类型定义格式如下:

union 共用体类型名 { 类型 成员1;
类型 成员2;
……
类型 成员N;
};

例:


  1. union Person //定义一个关于人事的共用体类型
  2. {
  3. int id; //员工ID
  4. float earn; //收到用户消费的金额,可能是小数
  5. };

共用体变量定义格式如下:

union 共用体类型名 共用体变量名

例:


  1. union Person m,n; //定义关于人事的共用体变量m和n

共用体变量可以在定义时赋值,也可以先定义后赋值。定义时赋值,或称初始化,只能给出一个成员的值。

例:


  1. union Person m = {1234},n = {20.5}; //两个成员共用一块内存,所以只能给出一个成员值

系统会根据给出初始化值类型,按照其对应的类型,来完成共用体赋值。

如上例。发现m初始值为1234,是个整数,就按整数类型存储共用体,此时由于id成员是整型,可以正常使用了。float成员由于存储格式与int类型不同,使用时可能无法达到预定效果。

如果有多个成员类型相同,那就无所谓了,反正类型相同,占用空间大小及内存存储格式相同,又共用一块内存,使用哪个都不会出错。

不同类型成员。由于存储格式、占用空间大小等情况不一样,虽然共用一块内存,表示的值是不一样的。如m值为1234,id由于是int类型,值是正常的。但是float存储格式是另一种方式,所以用来表示float时并不是1234.0,是多少现在不用理会,有兴趣可以了解计算机底层。

如果成员占用空间大小都不一样,表示的值可能也会偏离本意,本节不细究。

变量定义时赋值,用花括号{}括起成员,把成员按定义顺序依次给出,用逗号分隔。

引用成员格式是共用体变量名后面跟点.运算符再接成员名,即:

共用体变量名 . 成员名

例:


  1. m . earn = 20.5 ;

共用体类型和变量定义、初始化值也可以写在一起,很容易想到,格式应为:

union 共用类型名 { 类型 成员1; 类型 成员2; …… 类型 成员N; }共用体变量1={初始值1},共用体变量2={初始值2},……,共用体变量N={初始值N};

举个例子熟悉下:


  1. #include<stdio.h>
  2. int main( )
  3. {
  4. union Person //定义一个关于人事的共用体类型
  5. {
  6. int id; //员工ID
  7. float earn; //收到用户消费的金额,可能是小数
  8. };
  9. union Person m; //定义一个共用体变量
  10. char c ; //定义一个字符记录类型
  11. puts("要录入员工信息还是顾客信息:y表示员工,其它为顾客。");
  12. c = getchar();
  13. if('y' == c)
  14. {
  15. puts("请输入员工ID:");
  16. scanf("%d",&m.id);
  17. printf("\n员工ID为%d",m.id);
  18. }
  19. else
  20. {
  21. puts("请输入收取的顾客消费金额:");
  22. scanf("%f",&m.earn);
  23. printf("\n收取的顾客消费金额为%f",m.earn);
  24. }
  25. getchar( ) ;getchar( ) ; //使程序暂停一下
  26. return 0;
  27. }

输入y时效果图类似如下:

Pic

输入非y如n时效果图类似如下:

Pic

作者:冥河 QQ:3304576112
交流QQ群:554701039 C语言讲课群
本教程内容由本站保留版权,请勿复制传播
抖音
©2015-2024 惧留孙网 juliusun.com

京ICP备15039193号-1

首页 教程 下载 文章 聊天 我的