第8章第三讲共用体和枚举类型.ppt

上传人:sccc 文档编号:5667131 上传时间:2023-08-07 格式:PPT 页数:31 大小:138.51KB
返回 下载 相关 举报
第8章第三讲共用体和枚举类型.ppt_第1页
第1页 / 共31页
第8章第三讲共用体和枚举类型.ppt_第2页
第2页 / 共31页
第8章第三讲共用体和枚举类型.ppt_第3页
第3页 / 共31页
第8章第三讲共用体和枚举类型.ppt_第4页
第4页 / 共31页
第8章第三讲共用体和枚举类型.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《第8章第三讲共用体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《第8章第三讲共用体和枚举类型.ppt(31页珍藏版)》请在三一办公上搜索。

1、第8章 用户自定义数据类型 之 共用体和枚举类型,83 共用体 831 共用体的概念、类型说明和变量定义 1共用体的概念 程序设计有时需要在同一段内存中存取不同类型的变量,例如,在同一个地址开始的内存块中,分别存取整型变量、字符型变量、实型变量的值(如图813所示)。三种变量在内存中占有不同的字节数,但都从同一地址开始存放,它们的值可以相互覆盖。本节将介绍利用“共用体”类型来完成这样的操作。所谓共用体类型,就是几个不同类型的变量共占一段内存的结构。,第8章 用户自定义数据类型 之 共用体和枚举类型,2共用体类型的说明和变量定义 共用体类型说明和变量定义方式和结构体的方式完全相同。所不同的是,结

2、构体变量中的成员各自占有自己的存储空间,而共用体变量中的所有成员占有共同的存储空间。,第8章 用户自定义数据类型 之 共用体和枚举类型,例如:union u_type char ch;intm;float f;v;以上说明了一个共用体类型 u_type,同时还定义了一个该类型的共用体变量v。,第8章 用户自定义数据类型 之 共用体和枚举类型,共用体类型说明的一般形式为:union 共用体名 类型名1 共用体成员名1;类型名2 共用体成员名2;类型名n 共用体成员名n;共用体变量名表,第8章 用户自定义数据类型 之 共用体和枚举类型,说明:(1)其中union是C语言的关键字,用于说明共用体类型

3、。“共用体名”、“共用体成员名”以及“共用体变量名”都是由用户定义的标识符。(2)其中方括号内的内容可以省略,共用体变量的定义与结构体变量类似,可以在说明类型的同时定义变量;也可以先说明共用体类型,再用另一条语句定义共用体变量;还可以直接定义共用体变量,省略共用体名。,第8章 用户自定义数据类型 之 共用体和枚举类型,(3)共用体中的成员可以是简单变量,也可以是数组、指针、结构体和共用体(结构体的成员也可以是共用体),即共用体类型允许嵌套定义,例如:union u_tp struct unsigned char low,high;b;unsigned w;r;以上在共用体类型中,定义了一个结构

4、体成员b。本例中可以用r.b.low存取r.w的低字节的值,而用r.b.high存取rw的高字节的值。,第8章 用户自定义数据类型 之 共用体和枚举类型,也可以用rw一次存取双字节的值。又如:union u_tpl unsigned char c2;unsigned w;rl;本例共用体类型中,定义了一个数组成员c。可以用r1c0存取r1w低字 节的值,用r1cl存取r1w高字节的值。例如下列程序段:r1w0 x6141;/*0 x61是字母a的ASCII码,0 x41是字母A的ASCII码*/printf(”c,cn”,r1.c1,r1c0);输出结果是:a,A,第8章 用户自定义数据类型

5、之 共用体和枚举类型,(4)系统为所有共用体成员分配同一地址开始的存储空间,使用覆盖的方式共享存储单元。(5)共用体变量所占空间的大小取决于占存储空间最大的那个成员。例如上述例子中sizeof(u_type)或sizeof(v)的值均为4,因为成员ch、m、f中,f占4个字节的存储空间,是占存储空间最大的成员。(6)由于共用体变量中所有成员共享存储空间,因此变量中的所有成员的首地址相同,而且共用体变量的地址也就是该变量成员的地址。例如上述&r、&r.w、&r.b.low的值均相同。,第8章 用户自定义数据类型 之 共用体和枚举类型,3在定义共用体变量时赋初值 共用体变量在定义的同时只能对第一个

6、成员的值进行初始化。例如:union u_typel int i;float f;x123;以上在定义共用体变量x的同时给xi赋初值123。,第8章 用户自定义数据类型 之 共用体和枚举类型,832 共用体变量的使用 1共用体变量的使用 共用体变量中每个成员的使用方法与结构体完全相同,其一般格式为:共用体变量名成员名 例如,若有定义语句:union u_type char ch;int i;float f;v1,v2;,第8章 用户自定义数据类型 之 共用体和枚举类型,则下面均是合法的语句:v1f123;printf(“fn”,v1f);scanf(”c”,&v2ch);v1chv2ch+32

7、;printf(“cn”,v1ch);,第8章 用户自定义数据类型 之 共用体和枚举类型,说明:(1)可以像使用简单变量一样使用“共用体变量名成员名”。(2)对共用体某一成员赋值,会覆盖其他成员原来的数据,原来成员的值就不存在了,因此,共用体变量中起作用的是最后一次存人的成员变量的值。例如;v1ch=a;v1i0 x3f41;printf(”c,xn”,v1ch,v1i);以上程序段中,最后一次是给共用体中整型成员变量v1i赋十六进制数0 x3f41,低字节0 x41(即大写字母A的ASCII码)把前面的小写字母a的ASCII码0 x61覆盖了,因此输出结果为:A,3f41。,第8章 用户自定

8、义数据类型 之 共用体和枚举类型,2共用体变量的整体赋值 新的ANSIC标准允许在两个类型相同的共用体变量之间进行赋值操作。例如下面的程序段:v1i123;v2v1;printf(”dn”,v2i);输出结果为123。,第8章 用户自定义数据类型 之 共用体和枚举类型,3应用举例 例810某工厂的零件清单如图816所示。若零件是本厂生产的,则“零件来源”用车间代码(整型)表示;若零件不是本厂生产的,则“零件来源”用来源单位(字符数组)填写。要求输人、输出零件清单的数据(假设只有两个零件)。程序见课本。,第8章 用户自定义数据类型 之 共用体和枚举类型,84 枚举型 实际应用中,某些变量只有几种

9、可能的值,例如在模拟扑克牌的游戏中,扑克牌只有四种花色(梅花、方块、红桃、黑桃),可以把这种变量定义成枚举类型。枚举类型就是将变量的可取值一一列举出来,变量只能存取其中之一的值,存取其他值是错误的。,第8章 用户自定义数据类型 之 共用体和枚举类型,枚举类型说明和定义变量的形式为:enum 枚举类型名 枚举值1整型常数1),枚举值2整型常数2,枚举值n整型常数n枚举型变量名表例如:enum cardsclub,diamond,heart,spadecardl,card2;说明了一个enumcards枚举类型,同时定义了两个该类型的枚举型变量cardl与card2,它们的值只能取club、dia

10、mond、heart、spade之一。例如:cardlclub;、card2spade;都是合法的赋值语句。,第8章 用户自定义数据类型 之 共用体和枚举类型,说明:1enum是C语言的关键字,是枚举类型的引导字,用于说明枚举类型以及定义枚举变量,例如:enum weekdayMon,Tue,Wed,Thu,Fri,Sat,Sun;*说明枚举类型*enum colorsred,green,bluebkcolor,tecolor;*说明枚举类型的同时定义枚举型变量*enum operatorplus,minus,times,divide;*说明枚举类型*enum weekday workday,

11、week_end;*用已定义好的枚举类型定义枚举型变量*,第8章 用户自定义数据类型 之 共用体和枚举类型,2枚举类型的说明和变量定义有两种方式(如上),第一种方式把定义和说明分开;第二种方式在说明枚举类型的同时定义枚举变量。3枚举类型名和枚举值均为用户定义的标识符。枚举值又称为枚举元素或枚举常量,系统将枚举值作为整型常量来处理。因为是常量,因此不能在程序执行时赋值,也不能与其他标识符同名。若定义了上述几种枚举类型,以下语句均是非法的:int red;Mon1;minus2;,第8章 用户自定义数据类型 之 共用体和枚举类型,4方括号内的内容可以省略,如果省略“:整型常量”,编译程序按顺序给每

12、个枚举元素一个对应的整数值,整数值从0开始,后续元素顺序加1。例如上面的例子中,Mon的值为0,Tue的值为1,Sun的值为6。可以在定义时指定枚举元素对应的整数值,没有指定整数值的元素则在前一元素序号值的基础上顺序加1。例如:enum weekdaySun7,Mon1,Tue,Wed,Thu,Fri,Sat;此时Sun的值为7,Mon的值为1,Tue的值为2,Sat的值为6。指定枚举元素对应的值可以是负的整数,以后的枚举元素值仍依次加1。例如:enum operator plus,minus=-3,times,divide;则plus的值为0,minus的值为一3,times的值为一2,di

13、vide的值为一1。,第8章 用户自定义数据类型 之 共用体和枚举类型,5每个枚举元素之间用逗号“,”隔开,而不是用分号“;”隔开。6枚举变量只能取枚举类型说明结构中的某个枚举元素,若要对枚举型赋整数值必须进行强制类型转换。例如:enum weekday Sun=7,Mon=1,Tue,Wed,Thu,Fri,Sat workday,week_end;workdayMon;week_ end(enum weekday)(6);*相当于week_ endSat;*7枚举变量可以进行加(减)一个整数n的运算。例如:workdayMon;workday+;*此时workday的值变成Tue*8枚举变

14、量的值可以按其对应的整数值进行关系比较运算。例如:if(workdayMon)while(workdaySat),第8章 用户自定义数据类型 之 共用体和枚举类型,9枚举变量的值可以按其对应的整数输出整数值。例如:enum weekdaySun7,Mon1,Tue,Wed,Thu,Fri,Satwd;for(wdMon;wd=Sun;wd+)printf(”d,”,wd);上述程序段输出结果是:1,2,3,4,5,6,7,。85 typedef的用途 C语言中,除了可以使用数组、结构体、共用体和枚举型等构造类型之外,还可以使用关键字typedef对已有的类型说明一个新名称。用typedef说明

15、一种新类型名的形式为:typedef类型名新类型名;上述只说明了一个数据类型的新名字,而不是产生了一种新的数据类型,原有类型名依然有效。,第8章 用户自定义数据类型 之 共用体和枚举类型,“类型名”是在此语句之前已经定义了的类型标识符。“新类型名”是一个用户定义标识符,是新的类型名。例如:typedef float REAL;使用上述说明后,把标识符REAL说明成了一个float类型的类型名,REAL就成了float 的代名词。此后,可用标识符REAL来定义单精度实型变量。例如:REALx,y;*等价于floatx,y;*习惯上将新的类型名用大写字母表示,以便与系统提供的关键字或预处理标识符区

16、别开。,第8章 用户自定义数据类型 之 共用体和枚举类型,typedef可用来说明数组、结构体、共用体以及枚举型等类型名。下面举例说明。1typedef用于定义数组类型名 typedefintARRAY10;*说明ARRAY为有10个元素的整型数组类型名*ARRAYa,b;*定义a与b为整型数组变量,数组变量a与b各有10个元素*,第8章 用户自定义数据类型 之 共用体和枚举类型,2typedef用于定义结构体类型名 typedef struct charnumber10;charname10;floatscore5;STUDENT;*说明STUDENT为一个结构体类型名*STUDENTstu

17、;*定义stu为上述结构体类型的变量。*,第8章 用户自定义数据类型 之 共用体和枚举类型,3typedef用于定义共用体类型名 typedef union int i;char Ch;UTYPE;*说明UTYPE为一个共用体类型名。*UTYPE x,y;*定义x与y为上述共用体类型的变量*,第8章 用户自定义数据类型 之 共用体和枚举类型,4typedef用于定义枚举类型名 typedefenummale,femaleETYPE;*说明ETYPE为一个枚举类型名*ETYPEsex;*定义sex为上述枚举类型的变量*,第8章 用户自定义数据类型 之 共用体和枚举类型,说明:(1)综上所述,可用

18、如下3个步骤说明一个新类型名,步骤定义变量:先定义一个变量(如:int al0);将变量名换成新类型名(如:int ARRAY10);在最左边加上 typedef(如:typedef int ARRAY10;),新类型名定义完成;利用新类型名定义变量(如:ARRAY a,b;)。,第8章 用户自定义数据类型 之 共用体和枚举类型,(2)用typedef说明的是类型名,typedef不能用于定义变量。,第8章 用户自定义数据类型 指针与共用体,861 指向共用体变量的指针变量 指针变量可以指向一个共用体变量,此时可用下述三种方式之一存取共用体成员(三种方式是等价的):1共用体变量名共用体成员名

19、2指针变量名一共用体成员名 3(*指针变量名)共用体成员名 例818通过指针变量存取共用体成员数据。main()struct byte_tp unsigned char a1,ah;,第8章 用户自定义数据类型 指针与共用体,union reg_tp unsigned ax;struct byte_tp h;union reg_tp a,*p;p&a;aax0 x3b5e;printf(”axx,alx,ahxn”,p-ax,(*p).h.al,p-h.ah);p-h.a1-3;p-h.ah&=0 x0f;printf(”ax=x,a1=x,ahxn”,p-ax,(*p).h.al,p-h.ah);,运行结果:ax3b5e,a15e,ah3b axb5b,a15b,ahb,第8章 用户自定义数据类型 指针与共用体,上例说明了一个reg_tp共用体类型,以及定义相应的共用体变量a和指针变量p,变量a占内存两个字节,可使用ahah对它的高字节操作,使用aha1对它的低字节操作,使用aax对高、低两字节同时操作,这类似于“字存取”及“字节存取”CPU寄存器上的数据,如图821 所示。当指针变量p指向共用体变量a时,有下述等价表示关系。,图821共用体reg_tp类型,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号