C语言程序设计ppt第10章02.ppt
《C语言程序设计ppt第10章02.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计ppt第10章02.ppt(78页珍藏版)》请在三一办公上搜索。
1、2023/9/19,华中科技大学计算机学院,1,C语言程序设计,The C Programming Language,华中科技大学计算机学院曹计昌,2023/9/19,华中科技大学计算机学院,2,*10.7 联 合 10.7.1 联合类型的定义,与结构类似,联合类型也是一种构造类型。一个联合类型中包含有多个成员,这些成员共享共同的存储区域,但这些成员并不同时存在;联合存储区域的大小由各个成员中所占字节数最大的成员决定;在任何时刻,各个成员中只能有一个成员拥有该存储。除了用关键字union取代struct之外,联合类型的定义、联合变量的声明、以及联合成员的引用在语法上与结构完全相同。,2023/
2、9/19,华中科技大学计算机学院,3,如果有3个不同数据类型(char,short,long)的变量要分时共用一个共同的存储区域,则可以定义如下的联合类型:,union chlcharc;shorth;longl;这里chl是所定义的联合类型的联合名(tag),它与union一起形成一个union chl的联合类型。c、h、l是联合类型的成员。,2023/9/19,华中科技大学计算机学院,4,10.7.2 联合变量的声明、初始化及联合成员的引用,定义了union chl的联合类型后,可以通过:union chl u;来声明一个union chl类型的变量。也可以在定义union chl联合类型
3、的同时来声明相应的联合变量。如:union chlchar c;short h;long l;v=9;它在定义union chl联合类型的同时声明了联合类型的变量v,并且对其进行了初始化。在不产生二义的情况下,往往简称联合类型的变量为联合。,2023/9/19,华中科技大学计算机学院,5,联合变量的声明、初始化,值得注意的是,联合变量的初始化与结构的初始化在形式上相同,都应该用花括号界定初值,但联合是一种特殊形式的构造类型的数据,在同一时刻它只拥有其中的一个成员。因此,初始化时只能对联合的第1个成员进行初始化。换言之,初值表中只能包含与第1个成员数据类型相同的一个初值。如上面例子中的v=9。也
4、可以:union chl v=9,w=a;,2023/9/19,华中科技大学计算机学院,6,例10.12 通过例子对联合的特性进行进一步分析。,#include stdio.hunion chl charc;shorth;longl;void show(union chl*pu);void show_memoy(union chl*pu);,2023/9/19,华中科技大学计算机学院,7,void main(void)union chl u;printf(size of u is%dn,sizeof(u);u.l=0 x31323334L;show(,2023/9/19,华中科技大学计算机学院
5、,8,void 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(i4)printf(addr%dth byte of u is 0 x%pt,i,p+i);printf(the ASCII in%dth byte of u is%cn,i,*(p+i);i+;,2023/9/19,华中科技大学计算机学院
6、,9,程序的运行结果如下:size of u is 4char format:4int format:3334long format:31323334addr 0th byte of u is 0 xFFD8 the ASCII in 0th byte of u is 4addr 1th byte of u is 0 xFFD9 the ASCII in 1th byte of u is 3addr 2th byte of u is 0 xFFDA the ASCII in 2th byte of u is 2addr 3th byte of u is 0 xFFDB the ASCII in
7、 3th byte of u is 1char format:8int format:3638long format:31323638addr 0th byte of u is 0 xFFD8 the ASCII in 0th byte of u is 8addr 1th byte of u is 0 xFFD9 the ASCII in 1th byte of u is 6addr 2th byte of u is 0 xFFDA the ASCII in 2th byte of u is 2addr 3th byte of u is 0 xFFDB the ASCII in 3th byt
8、e of u is 1,2023/9/19,华中科技大学计算机学院,10,对程序和程序的运行结果可以做如下分析:1)联合的存储结构从sizeof(u)的结果为4可以看出,联合u所占存储的大小为4个字节,这正好是长整型成员l所占存储的大小。这4个字节的存储是连续的,地址从0 xFFD8至0 xFFDB。u.l 的值为0 x31323334L,u的存储描述为:,2023/9/19,华中科技大学计算机学院,11,2)联合的指针,可以声明联合类型的指针。如:union chl v,*pv=说明了一个union chl类型的指针pv,并且取出v地址对pv进行初始化,使联合指针pv指向了联合变量v。值得注
9、意的是,联合所有成员的地址和联合变量的地址都是相同的。因为所有成员都是从同一存储空间的边界(低地址)开始存放。但是,不同成员指针值(地址值)的类型是不相同的。因此,&u,&u.c,&u.h,&u.l的地址都相同。但&u的数据类型是union chl*。&u.c的数据类型是char*。&u.h的数据类型是int short*。&u.l的数据类型是long int*。,2023/9/19,华中科技大学计算机学院,12,3)联合成员的引用,可以通过联合变量和“.”操作符,以及指向联合变量的指针和“-”操作符来引用联合成员。从u.l,(*pu).c,pu-h三个表达式中可以归纳出对联合成员的引用形式为
10、:(1)联合变量名.成员名。(2)(*指向联合变量的指针).成员名。(3)指向联合变量的指针-成员名。例如:u.c 或(*pu).c 或pu-c 都表示引用联合成员c,类型是char。u.h 或(*pu).h 或pu-h 都表示引用联合成员h,类型是short。u.l 或(*pu).l 或pu-l 都表示引用联合成员c,类型是long。而u.c=a,(*pu).h=0 x3839,以及pu-l=0 x31323334L分别表示对联合u的成员c、h、l的赋值操作。,2023/9/19,华中科技大学计算机学院,13,4)共享存储的特点,在main函数中,u.l=0 x31323334L;赋值语句产
11、生的存储可由表10-3描述,各字节的地址由高向低,依次存放0 x31、0 x32、0 x33、0 x34,联合u由成员l使用。由show函数和相应的运行结果可以看出,此时如果按照(*pu).c解释,输出的只是共享存储的低字节的内容0 x34或字符4。如果按照,pu-h解释,输出的只是共享存储的低端2个字节的内容0 x33和0 x34。执行u.h=0 x3638;语句之后,联合u由成员h使用。该语句修改了共享存储低端2个字节的内容,但是高端2个字节的内容没有变化。,2023/9/19,华中科技大学计算机学院,14,5)相容性操作,联合中允许存储不同类型的数据,对某个时刻存储的数据,其所允许的操作
12、也有所不同,有些操作对该类型的数据是相容的,但有些操作却不相容(得不到正确结果)。由于语法上合法,编译器对这种情况不会报错,但运算的结果却不正确。假如在union chl中增加一个成员(其它都不变),如:float f;则在show函数中,如果执行语句为:printf(float format:%fn,pu-f);则得到是不正确的结果0.00,而其他语句中操作却是相容的。,2023/9/19,华中科技大学计算机学院,15,*10.8 字段结构,由多个相邻的二进制位可以组成结构或者联合中的整型或无符号整型成员,这些个相邻的二进制位被称为字段(bit field),对应的成员称为结构或联合的字段成
13、员,以字段为成员的结构称为字段结构。组成字段的二进制位的数目成为该字段的宽度,它是一个非负的整型常量表达式。字段结构在操作系统,编译程序,嵌入式系统的C语言编程方面使用较多。例如,stdio.h中关于文件状态成员flags的取值就规定了1为读状态,2为写状态,4为缓冲数据状态等等。这些数据都是一些值很小的整数,没有必要用int或char变量来存储每一个值。通常对若干个特征中的每个特征按照取值的大小分配合适的二进制位,然后将它们组织成为字段封装到一个int或char变量中。这样就可以通过字段名对相应的二进制位或位串进行操作,而不必采用前面章节介绍的位运算。,2023/9/19,华中科技大学计算机
14、学院,16,10.8.1 字段结构类型的定义,字段结构也属于构造类型,因此要先定义字段结构类型,再声明字段结构变量,然后再对字段结构变量中的成员进行操作。考虑十字路口的交通灯.颜色枚举类型的声明如下:enum color OFF=0,RED=1,YELLOW=2,GREEN=3;,2023/9/19,华中科技大学计算机学院,17,struct traffic_lightunsigned short int east:2;/*东组灯状态字段*/unsigned short int south:2;/*南组灯状态字段*/unsigned short int west:2;/*西组灯状态字段*/un
15、signed short 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组交通灯的字段结构类型的声明,2023/9/19,华中科技大学计算机学院,18,4组交通灯的字段结构类型的简略形式声明,st
16、ruct 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;上面声明了一个struct traffic_light的字段结构类型,east、south、north_on为它的字段成员,字段成员往往也简称为字段。冒号后面的整数说明了成员的字段宽度,字段宽度是一个非负的整型常量表达式。上面定义中,其中字段宽度为2的四个成员用unsigned char更加简练,但Turbo C中不支持u
17、nsigned char,因此用unsigned short int。,2023/9/19,华中科技大学计算机学院,19,10.8.2 字段结构类型变量的声明及成员的引用,可以先定义字段结构类型,再声明字段结构类型的变量。如:struct traffic_light Jiedaokou;它声明了struct traffic_light的字段结构类型变量Jiedaokou。同时,还可以在声明字段结构类型的变量的同时对其进行初始化。如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0;它将east、north_on这9个字段成员都初始化为0。,202
18、3/9/19,华中科技大学计算机学院,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=字段就是一个小整数,它可以出现在其它整数可以出现的任何地方。字段在参与运算时被自动转换为int或unsigned int类型的整数。对一个字
19、段结构中成员的引用与对一般结构变量中结构成员的引用方法相同,有“.”和“-”两种。如:Jiedaokou.west,Jiedaokou.west_on,p-north,p-north_on等。,2023/9/19,华中科技大学计算机学院,21,例10.13 字段结构变量的成员引用举例。,void main(void)struct traffic_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(Ji
20、edaokou.west_on=%un,Jiedaokou.west_on);printf(Jiedaokou.east=%ut,Jiedaokou.east);printf(Jiedaokou.east_on=%un,Jiedaokou.east_on);程序的运行结果如下:Jiedaokou.west=3 Jiedaokou.west_on=5Jiedaokou.east=0 Jiedaokou.east_on=0,2023/9/19,华中科技大学计算机学院,22,字段成员的宽度问题,由于字段成员表示整数的范围有限,在对字段成员赋值时不要超出了它表示数的范围。如果超出了它表示数的范围,则数
21、的高位部分将被丢弃。如Jiedaokou.west_on的宽度为4,它能够表示数的范围是015。如果执行Jiedaokou.west_on=17(即0 x11 或00010001B),编译时不会报错,如果再执行:printf(Jiedaokou.west_on=%un,Jiedaokou.west_on);其输出为1。高位“1”被丢弃。,2023/9/19,华中科技大学计算机学院,23,可以通过指向字段结构变量的指针来操纵字段结构变量的成员。,如:struct traffic_light Jiedaokou=0,0,0,0,0,0,0,0,0,*p=,2023/9/19,华中科技大学计算机学院
22、,24,10.8.3 字段结构与联合的应用,本节通过一个例子说明如何访问一个16位字中的高低字节和各二进制位。例子中将字段byte0和byte1的宽度定义为8,用以表示一个16位字中的高字节和低字节;将字段b0b15宽度定义为1,用以表示一个16位字中的各个二进制位。并且用联合使一个短整型变量、2个字节字段与16个位字段共享共同的存储。,2023/9/19,华中科技大学计算机学院,25,例10.14 用字段和联合访问一个16位字中的高低字节和各二进制位的应用举例。,#include stdio.h#define CHAR_BIT 8struct w16_bytes unsigned short
23、 byte0:8,byte1:8;/*byte0为低字节,byte1为高字节*/;struct w16_bits unsigned short b0:1,b1:1,b2:1,b3:1,b4:1,b5:1,b6:1,b7:1,b8:1,b9:1,b10:1,b11:1,b12:1,b13:1,b14:1,b15:1;,2023/9/19,华中科技大学计算机学院,26,union w16/*短整型变量、结构成员byte、结构成员bit共享共同的存储*/shorti;struct w16_bytesbyte;struct w16_bitsbit;void main(void)union w16w=0
24、;/*i为0;byte0和byte1也为0;b0至b15皆为0*/void bit_print(short);w.bit.b9=1;/*相当于byte1为2*/w.bit.b10=1;/*相当于byte1为6*/w.byte.byte0=b;printf(w.i=0 x%xn,w.i);/*按整型解释、输出共享存储的内容*/bit_print(w.i);/*从高到低,逐位输出共享存储的各bit值*/,2023/9/19,华中科技大学计算机学院,27,void bit_print(short num)int i,shift=sizeof(short)*CHAR_BIT;int mask=1(sh
25、ift-1);/*掩码mask的最高位为1,其余15位为0*/for(i=1;i=shift;i+)putchar(num,2023/9/19,华中科技大学计算机学院,28,程序中mask最高位为1,其余15位为0,通常称为掩码,将它与短整型变量作按位与运算用以测试短整型变量的最高位是0还是1。在bit_print函数中的for循环中,每循环一次,通过num=1将次高位移至最高位。w.bit.b9=1和w.bit.b10=1将i的高字节设成6,w.byte.byte0=b将i的低字节设成62(b的ASCII码)。bit_print函数将num在内存中的值以二进制位的方式输出。程序的运行结果如下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 ppt 10 02
链接地址:https://www.31ppt.com/p-6071081.html