C语言程序设计ppt-第10章-02

上传人:aa****6 文档编号:48681208 上传时间:2018-07-19 格式:PPT 页数:100 大小:217.50KB
返回 下载 相关 举报
C语言程序设计ppt-第10章-02_第1页
第1页 / 共100页
C语言程序设计ppt-第10章-02_第2页
第2页 / 共100页
C语言程序设计ppt-第10章-02_第3页
第3页 / 共100页
C语言程序设计ppt-第10章-02_第4页
第4页 / 共100页
C语言程序设计ppt-第10章-02_第5页
第5页 / 共100页
点击查看更多>>
资源描述

《C语言程序设计ppt-第10章-02》由会员分享,可在线阅读,更多相关《C语言程序设计ppt-第10章-02(100页珍藏版)》请在金锄头文库上搜索。

1、C语言程序设计The C Programming Language华中科技大学计算机学院 曹计昌*1华中科技大学计算机学院*10.7 联 合 10.7.1 联合类型的定义 n与结构类似,联合类型也是一种构造类型。 (1)一个联合类型中包含有多个成员; (2)这些成员共享共同的存储区域,但这些成员并不 同时存在; (3)联合存储区域的大小由各个成员中所占字节数最 大的成员决定; (4)在任何时刻,各个成员中只能有一个成员拥有该 存储。 n除了用关键字union取代struct之外,联合类型的 定义、联合变量的声明、以及联合成员的引用在语 法上与结构完全相同。 Date2华中科技大学计算机学院如果

2、有3个不同数据类型(char, short, long ) 的变量要分时共用一个共同的存储区域,则可以定义如下的联合类型: union chl charc; shorth; longl; ;n这里chl是所定义的联合类型的联合名(tag) , 它与union一起形成一个union chl的联合类型。c 、h、l是联合类型的成员。 Date3华中科技大学计算机学院10.7.2 联合变量的声明、初始化 及联合成员的引用 n定义了union chl的联合类型后,可以通过: union chl u; 来声明一个union chl类型的变量。n也可以在定义union chl联合类型的同时来声明相应的联合

3、 变量。如: union chl char c; short h; long l; v=9;n它在定义union chl联合类型的同时声明了联合类型的变量 v,并且对其进行了初始化。n在不产生二义的情况下,往往简称联合类型的变量为联合 。Date4华中科技大学计算机学院联合变量的声明、初始化n值得注意的是,联合变量的初始化与结构的初始化 在形式上相同,都应该用花括号界定初值,但联合 是一种特殊形式的构造类型的数据,在同一时刻它 只拥有其中的一个成员。n因此,初始化时只能对联合的第1个成员进行初始 化。换言之,初值表中只能包含与第1个成员数据 类型相同的一个初值。n如上面例子中的v=9。也可以:

4、 union chl v=9,w=a;Date5华中科技大学计算机学院例10.12 通过例子对联合的特性 进行进一步分析。#include “stdio.h“ union chlcharc;shorth;longl; ; void show(union chl *pu); void show_memoy(union chl *pu); Date6华中科技大学计算机学院void main(void) union chl u;printf(“size of u is %dn“,sizeof(u);u.l=0x31323334L;show(show_memoy(u.h=0x3638;show(sho

5、w_memoy( Date7华中科技大学计算机学院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(i”操作符来引用联合成员。从u.l,(*pu).c,pu-h三个表 达式中可以归纳出对联合成员的引用形式为: (1)联合变量名.成员名。 (2)(*指向联合变量的指

6、针).成员名。 (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=0x3839,以及pu- l=0x31323334L分别表示对联合u的成员c、h、l的赋值 操作。 Date12华中科技大学计算机学院4) 共享存储的特点n在main函数中,u.l=0x31323334L;赋值语句产 生的存储可由表10-3描述,各字节的地址由高向低 ,

7、依次存放0x31、0x32、0x33、0x34,联合u 由成员l使用。n由show函数和相应的运行结果可以看出,此时如 果按照(*pu).c解释,输出的只是共享存储的低字 节的内容0x34或字符4。如果按照,pu-h解释 ,输出的只是共享存储的低端2个字节的内容0x33 和0x34。n执行u.h=0x3638;语句之后,联合u由成员h使用 。该语句修改了共享存储低端2个字节的内容,但 是高端2个字节的内容没有变化。 Date13华中科技大学计算机学院5) 相容性操作n联合中允许存储不同类型的数据,对某个时刻存储的数据 ,其所允许的操作也有所不同,有些操作对该类型的数据 是相容的,但有些操作却不

8、相容(得不到正确结果)。n由于语法上合法,编译器对这种情况不会报错,但运算的 结果却不正确。n假如在union chl中增加一个成员(其它都不变),如: float f;则在show函数中,如果执行语句为: printf(“float format: %fn“,pu-f); 则得到是不正确的结果0.00,而其他语句中操作却是相容 的。 Date14华中科技大学计算机学院*10.8 字段结构n由多个相邻的二进制位可以组成结构或者联合中的整型或无 符号整型成员,这些个相邻的二进制位被称为字段(bit field),对应的成员称为结构或联合的字段成员,以字段为 成员的结构称为字段结构。n组成字段的二

9、进制位的数目成为该字段的宽度,它是一个非 负的整型常量表达式。n字段结构在操作系统,编译程序,嵌入式系统的C语言编程 方面使用较多。n例如,stdio.h中关于文件状态成员flags的取值就规定了1为 读状态,2为写状态,4为缓冲数据状态等等。这些数据都是 一些值很小的整数,没有必要用int或char变量来存储每一个 值。n通常对若干个特征中的每个特征按照取值的大小分配合适的 二进制位,然后将它们组织成为字段封装到一个int或char变 量中。这样就可以通过字段名对相应的二进制位或位串进行 操作,而不必采用前面章节介绍的位运算。 Date15华中科技大学计算机学院10.8.1 字段结构类型的定

10、义n字段结构也属于构造类型,因此要先定义字 段结构类型,再声明字段结构变量,然后再 对字段结构变量中的成员进行操作。n考虑十字路口的交通灯 .颜色枚举类型的声 明如下: enum color OFF=0,RED=1,YELLOW=2,GREEN=3; Date16华中科技大学计算机学院struct traffic_light unsigned short int east:2;/* 东组灯状态字段 */ unsigned short int south:2; /* 南组灯状态字段 */ unsigned short int west:2; /* 西组灯状态字段 */ unsigned shor

11、t 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组交通灯的字段结构类型的声明Date17华中科技大学计算机学院4组交通灯字段结构类型的简略形式声明 st

12、ruct traffic_light unsigned 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为它的字段成员,字段成员 往往也简称为字段。n冒号后面的整数说明了成员的字段宽度,字段宽度是一个非 负的整型常量表达式。n上面定义中,其中字段宽度为2的四个成员用unsigned char更加简练,但Tu

13、rbo C中不支持unsigned char,因 此用unsigned short int。Date18华中科技大学计算机学院10.8.2 字段结构类型变量的声明及 成员的引用 n可以先定义字段结构类型,再声明字段结构类型的 变量。如: 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个字段成

14、员都初始化为0。 Date19华中科技大学计算机学院也可以在定义字段结构类型的同时声明字段结构变量并对其成员进行初始化。如: struct traffic_light unsigned 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=n字段就是一个小整数,它可以出现在其它整数可以出现的任 何地方。字段在参与运算时被自动转换为int或unsigned int类

15、型的整数。n对一个字段结构中成员的引用与对一般结构变量中结构成员 的引用方法相同,有“.”和“-”两种。如: Jiedaokou.west,Jiedaokou.west_on, p-north,p-north_on等。 Date20华中科技大学计算机学院例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)

16、; 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 Jiedaokou.west_on=5 Jiedaokou.east=0 Jiedaokou.east_on=0 Date21华中科技大学计算机学院字段成员的宽度问题n由于字段成员表示整数的范围有限,在对字段成员赋值时不 要超出了它表示数的范围。如果超出了它表示数的范围,则 数的高位部分将被丢弃。n如Jiedaokou.west_on的宽度为4,它能够表示数的范围是 015。如果执行Jied

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号