C语言程序设计-第10章-02课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C语言程序设计-第10章-02课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 10 02 课件
- 资源描述:
-
1、2023-2-11华中科技大学计算机学院1C C语言程序设计语言程序设计The C Programming Language华中科技大学计算机学院华中科技大学计算机学院曹计昌曹计昌2023-2-11华中科技大学计算机学院2*10.7 10.7 联联 合合 10.7.1 10.7.1 联合类型的定义联合类型的定义 n与结构类似,联合类型也是一种构造类型。与结构类似,联合类型也是一种构造类型。一个联合类型中包含有多个成员,这些成员一个联合类型中包含有多个成员,这些成员共享共同的存储区域,但这些成员并不同时共享共同的存储区域,但这些成员并不同时存在存在;联合存储区域的大小由各个成员中所占联合存储区域
2、的大小由各个成员中所占字节数最大的成员决定字节数最大的成员决定;在任何时刻,各个成在任何时刻,各个成员中只能有一个成员拥有该存储。员中只能有一个成员拥有该存储。n除了用关键字除了用关键字union取代取代struct之外,联合类之外,联合类型的定义、联合变量的声明、以及联合成员型的定义、联合变量的声明、以及联合成员的引用在语法上与结构完全相同。的引用在语法上与结构完全相同。2023-2-11华中科技大学计算机学院3如果有如果有3 3个不同数据类型(个不同数据类型(char,short,char,short,long long)的变量要分时共用一个共同的存储区)的变量要分时共用一个共同的存储区域
3、,则可以定义如下的联合类型:域,则可以定义如下的联合类型:union chlcharc;shorth;longl;n这里这里chl是所定义的联合类型的联合名(是所定义的联合类型的联合名(tag),它它与与union一起形成一个一起形成一个union chl的联合类型。的联合类型。c、h、l是联合类型的成员。是联合类型的成员。2023-2-11华中科技大学计算机学院410.7.2 10.7.2 联合变量的声明、初始化及联合变量的声明、初始化及联合成员的引用联合成员的引用 n定义了定义了union chl的联合类型后,可以通过:的联合类型后,可以通过:union chl u;来声明一个来声明一个u
4、nion chl类型的变量。类型的变量。n也可以在定义也可以在定义union chl联合类型的同时来声明相应的联合联合类型的同时来声明相应的联合变量。如:变量。如:union chlchar c;short h;long l;v=9;n它在定义它在定义union chl联合类型的同时声明了联合类型的变量联合类型的同时声明了联合类型的变量v,并且对其进行了初始化。并且对其进行了初始化。n在不产生二义的情况下,往往简称联合类型的变量为联合。在不产生二义的情况下,往往简称联合类型的变量为联合。2023-2-11华中科技大学计算机学院5联合变量的声明、初始化联合变量的声明、初始化n值得注意的是,联合变
5、量的初始化与结构的初始化值得注意的是,联合变量的初始化与结构的初始化在形式上相同,都应该用花括号界定初值,但联合在形式上相同,都应该用花括号界定初值,但联合是一种特殊形式的构造类型的数据,在同一时刻它是一种特殊形式的构造类型的数据,在同一时刻它只拥有其中的一个成员。只拥有其中的一个成员。n因此,初始化时只能对联合的第因此,初始化时只能对联合的第1个成员进行初始化。个成员进行初始化。换言之,初值表中只能包含与第换言之,初值表中只能包含与第1个成员数据类型相个成员数据类型相同的一个初值。同的一个初值。n如上面例子中的如上面例子中的v=9。也可以:。也可以:union chl v=9,w=a;202
6、3-2-11华中科技大学计算机学院6例例10.12 10.12 通过例子对联合的特性通过例子对联合的特性进行进一步分析。进行进一步分析。#include stdio.hunion chl charc;shorth;longl;void show(union chl*pu);void show_memoy(union chl*pu);2023-2-11华中科技大学计算机学院7void main(void)union chl u;printf(size of u is%dn,sizeof(u);u.l=0 x31323334L;show(&u);show_memoy(&u);u.h=0 x3638
7、;show(&u);show_memoy(&u);2023-2-11华中科技大学计算机学院8void show(union chl*pu)printf(char format:%cn,(*pu).c);printf(int format:%hxn,pu-h);printf(long format:%lxn,(*pu).l);void show_memoy(union chl*pu)char*p=(char*)pu;int i=0;while(i”操作符来引用联合成员。从操作符来引用联合成员。从u.l,(*pu).c,pu-h三个三个表达式中可以归纳出对联合成员的引用形式为:表达式中可以归纳出对
8、联合成员的引用形式为:(1)联合变量名)联合变量名.成员名。成员名。(2)(*指向联合变量的指针指向联合变量的指针).成员名。成员名。(3)指向联合变量的指针)指向联合变量的指针-成员名。成员名。n例如:例如:u.c 或或(*pu).c 或或pu-c 都表示引用联合成员都表示引用联合成员c,类,类型是型是char。u.h 或或(*pu).h 或或pu-h 都表示引用联合成员都表示引用联合成员h,类型是,类型是short。u.l 或或(*pu).l 或或pu-l 都表示引用联合成员都表示引用联合成员c,类型是,类型是long。n而而u.c=a,(*pu).h=0 x3839,以及,以及pu-l=
9、0 x31323334L分别表示对联合分别表示对联合u的成员的成员c、h、l的赋值操的赋值操作。作。2023-2-11华中科技大学计算机学院134)4)共享存储的特点共享存储的特点n在在main函数中,函数中,u.l=0 x31323334L;赋值语句产生赋值语句产生的的存储可由表存储可由表10-3描述,各字节的地址由高向低,描述,各字节的地址由高向低,依次存放依次存放0 x31、0 x32、0 x33、0 x34,联合,联合u由成由成员员l使用。使用。n由由show函数和相应的运行结果可以看出,此时如果函数和相应的运行结果可以看出,此时如果按照按照(*pu).c解释,输出的只是共享存储的低字
10、节的解释,输出的只是共享存储的低字节的内容内容0 x34或字符或字符4。如果按照。如果按照,pu-h解释,输出解释,输出的只是共享存储的低端的只是共享存储的低端2个字节的内容个字节的内容0 x33和和0 x34。n执行执行u.h=0 x3638;语句之后,联合语句之后,联合u由成员由成员h使用。使用。该语句修改了共享存储低端该语句修改了共享存储低端2个字节的内容,但是高个字节的内容,但是高端端2个字节的内容没有变化。个字节的内容没有变化。2023-2-11华中科技大学计算机学院145)5)相容性操作相容性操作n联合中允许存储不同类型的数据,对某个时刻存储的数据,联合中允许存储不同类型的数据,对
11、某个时刻存储的数据,其所允许的操作也有所不同,有些操作对该类型的数据是相其所允许的操作也有所不同,有些操作对该类型的数据是相容的,但有些操作却不相容(得不到正确结果)。容的,但有些操作却不相容(得不到正确结果)。n由于语法上合法,编译器对这种情况不会报错,但运算的结由于语法上合法,编译器对这种情况不会报错,但运算的结果却不正确。果却不正确。n假如在假如在union chl中增加一个成员(其它都不变),如:中增加一个成员(其它都不变),如:float f;则在则在show函数中,如果执行语句为:函数中,如果执行语句为:printf(float format:%fn,pu-f);则得到是不正确的结
12、果则得到是不正确的结果0.00,而其他语句中操作却是相容的。,而其他语句中操作却是相容的。2023-2-11华中科技大学计算机学院15*10.8 10.8 字段结构字段结构n由由多个相邻的二进制位可以组成结构或者联合中的整型或无多个相邻的二进制位可以组成结构或者联合中的整型或无符符号整型成员,这些个相邻的二进制位被称为字段(号整型成员,这些个相邻的二进制位被称为字段(bit field),对应的成员称为结构或联合的字段成员,以字段为),对应的成员称为结构或联合的字段成员,以字段为成员的结构称为字段结构。成员的结构称为字段结构。n组成字段的二进制位的数目成为该字段的宽度,它是一个非组成字段的二进
13、制位的数目成为该字段的宽度,它是一个非负的整型常量表达式。负的整型常量表达式。n字段结构在操作系统,编译程序,嵌入式系统的字段结构在操作系统,编译程序,嵌入式系统的C语言编程方语言编程方面使用较多。面使用较多。n例如,例如,stdio.h中关于文件状态成员中关于文件状态成员flags的取值就规定了的取值就规定了1为为读状态,读状态,2为写状态,为写状态,4为缓冲数据状态等等。这些数据都是为缓冲数据状态等等。这些数据都是一些值很小的整数,没有必要用一些值很小的整数,没有必要用int或或char变量来存储每一个变量来存储每一个值。值。n通常对若干个特征中的每个特征按照取值的大小分配合适的通常对若干
14、个特征中的每个特征按照取值的大小分配合适的二进制位,然后将它们组织成为字段封装到一个二进制位,然后将它们组织成为字段封装到一个int或或char变变量中。这样就可以通过字段名对相应的二进制位或位串进行量中。这样就可以通过字段名对相应的二进制位或位串进行操作,而不必采用前面章节介绍的位运算。操作,而不必采用前面章节介绍的位运算。2023-2-11华中科技大学计算机学院1610.8.1 10.8.1 字段结构类型的定义字段结构类型的定义n字段结构也属于构造类型,因此要先定义字字段结构也属于构造类型,因此要先定义字段结构类型,再声明字段结构变量,然后再段结构类型,再声明字段结构变量,然后再对字段结构
15、变量中的成员进行操作。对字段结构变量中的成员进行操作。n考虑十字路口的交通灯考虑十字路口的交通灯.颜色枚举类型的声明颜色枚举类型的声明如下:如下:enum color OFF=0,RED=1,YELLOW=2,GREEN=3;2023-2-11华中科技大学计算机学院17struct traffic_lightunsigned short int east:2;/*东组灯状态字段东组灯状态字段*/unsigned short int south:2;/*南组灯状态字段南组灯状态字段*/unsigned short int west:2;/*西组灯状态字段西组灯状态字段*/unsigned sho
16、rt int north:2;/*北组灯状态字段北组灯状态字段*/unsigned short int reserve:8;/*保留字段保留字段*/unsigned short int east_on:4;/*东组灯开通时间东组灯开通时间*/unsigned short int south_on:4;/*南组灯开通时间南组灯开通时间*/unsigned short int west_on:4;/*西组灯开通时间西组灯开通时间*/unsigned short int north_on:4;/*北组灯开通时间北组灯开通时间*/;4 4组交通灯的字段结构类型的声明组交通灯的字段结构类型的声明2023
17、-2-11华中科技大学计算机学院184 4组交通灯的字段结构类型的简略形式声明组交通灯的字段结构类型的简略形式声明 struct traffic_lightunsigned short int east:2,south:2,west:2,north:2,reserve:8;unsigned short int east_on:4,south_on:4,west_on:4,north_on:4;n上面声明了一个上面声明了一个struct traffic_light的字段结构类型,的字段结构类型,east、south、north_on为它的字段成员,字段成员往往也简为它的字段成员,字段成员往往也简
18、称为字段。称为字段。n冒号后面的整数说明了成员的字段宽度,字段宽度是一个非冒号后面的整数说明了成员的字段宽度,字段宽度是一个非负的整型常量表达式。负的整型常量表达式。n上面定义中,其中字段宽度为上面定义中,其中字段宽度为2的四个成员用的四个成员用unsigned char更加简练,但更加简练,但Turbo C中不支持中不支持unsigned char,因此,因此用用unsigned short int。2023-2-11华中科技大学计算机学院1910.8.2 10.8.2 字段结构类型变量的声明及成员字段结构类型变量的声明及成员的引用的引用 n可以先定义字段结构类型,再声明字段结构类型的可以先
19、定义字段结构类型,再声明字段结构类型的变量。如:变量。如:struct traffic_light Jiedaokou;它声明了它声明了struct traffic_light的字段结构类型变量的字段结构类型变量Jiedaokou。n同时,还可以在声明字段结构类型的变量的同时对同时,还可以在声明字段结构类型的变量的同时对其进行初始化。如:其进行初始化。如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0;它将它将east、north_on这这9个字段成员都初始化为个字段成员都初始化为0。2023-2-11华中科技大学计算机学院20也可以在定义字段
20、结构类型的同时声明字段结构变量也可以在定义字段结构类型的同时声明字段结构变量并对其成员进行初始化。如:并对其成员进行初始化。如:struct traffic_lightunsigned short int east:2,south:2,west:2,north:2,reserve:8;unsigned short int east_on:4,south_on:4,west_on:4,north_on:4;Jiedaokou=0,0,0,0,0,0,0,0,0,*p=&Jiedaokou;n字段就是一个小整数,它可以出现在其它整数可以出现的任字段就是一个小整数,它可以出现在其它整数可以出现的任何
21、地方。字段在参与运算时被自动转换为何地方。字段在参与运算时被自动转换为int或或unsigned int类型的整数。类型的整数。n对一个字段结构中成员的引用与对一般结构变量中结构成员对一个字段结构中成员的引用与对一般结构变量中结构成员的引用方法相同,有的引用方法相同,有“.”和和“-”两种。如:两种。如:Jiedaokou.west,Jiedaokou.west_on,p-north,p-north_on等。等。2023-2-11华中科技大学计算机学院21例例10.13 10.13 字段结构变量的成员引用举例。字段结构变量的成员引用举例。void main(void)struct traffi
22、c_light Jiedaokou=0,0,0,0,0,0,0,0,0;Jiedaokou.west=GREEN;Jiedaokou.west_on=5;printf(Jiedaokou.west=%ut,Jiedaokou.west);printf(Jiedaokou.west_on=%un,Jiedaokou.west_on);printf(Jiedaokou.east=%ut,Jiedaokou.east);printf(Jiedaokou.east_on=%un,Jiedaokou.east_on);程序的运行结果如下:程序的运行结果如下:Jiedaokou.west=3 Jiedao
23、kou.west_on=5Jiedaokou.east=0 Jiedaokou.east_on=0 2023-2-11华中科技大学计算机学院22字段成员的宽度问题字段成员的宽度问题n由于字段成员表示整数的范围有限,在对字段成员赋值时不由于字段成员表示整数的范围有限,在对字段成员赋值时不要超出了它表示数的范围。如果超出了它表示数的范围,则要超出了它表示数的范围。如果超出了它表示数的范围,则数的高位部分将被丢弃。数的高位部分将被丢弃。n如如Jiedaokou.west_on的宽度为的宽度为4,它能够表示数的范围是,它能够表示数的范围是0 15。如果执行。如果执行Jiedaokou.west_on=
24、17(即(即0 x11 或或00010001B),编译时不会报错,),编译时不会报错,如果再执行:如果再执行:printf(Jiedaokou.west_on=%un,Jiedaokou.west_on);其输出为其输出为1。高位。高位“1”被丢弃。被丢弃。2023-2-11华中科技大学计算机学院23可以通过指向字段结构变量的指针来操纵字段可以通过指向字段结构变量的指针来操纵字段结构变量的成员。结构变量的成员。n如如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0,*p=&Jiedaokou;它声明了一个它声明了一个struct traffic
25、_light类型的字段结构指针类型的字段结构指针p,并且使并且使p指向了字段结构变量指向了字段结构变量Jiedaokou。n而而p-north=RED;p-north_on=6;分别表示通过指针分别表示通过指针p引用引用Jiedaokou的成员的成员north和和north_on,并通过赋值操作对这些成员进行赋值。,并通过赋值操作对这些成员进行赋值。n下面的语句则是输出相应的结果:下面的语句则是输出相应的结果:printf(Jiedaokou.north=%ut,p-north);printf(Jiedaokou.north_on=%un,p-north_on);2023-2-11华中科技大学
展开阅读全文