C语言程序设计_10共用体与枚举_第1页
C语言程序设计_10共用体与枚举_第2页
C语言程序设计_10共用体与枚举_第3页
C语言程序设计_10共用体与枚举_第4页
C语言程序设计_10共用体与枚举_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第第10章章 共用体与枚举共用体与枚举10.1 共用体共用体10.2 枚举枚举10.3 位运算与位段结构位运算与位段结构10.4 用用TYPEDEF定义类型名定义类型名本章小结本章小结10.1 共共 用用 体体10.1.1 共用体变量的定义共用体变量的定义共用体类型的定义形式与结构体类型的定义形式相同,共用体类型的定义形式与结构体类型的定义形式相同,只是其类型关键字不同,共用体的关键字为只是其类型关键字不同,共用体的关键字为UNION。一般格式为:一般格式为:UNION共用体类型名 成员说明列表成员说明列表;例如:例如:UNION DATA INT I; CHAR CH; FLOAT F;同定

2、义结构体变量一样,定义共同体变量也有同定义结构体变量一样,定义共同体变量也有3种方式:种方式:(1)先定义共用体类型,再定义共用体类型变量。)先定义共用体类型,再定义共用体类型变量。(2)在定义共用体类型的同时定义共用体类型变量。)在定义共用体类型的同时定义共用体类型变量。(3)定义共用体类型时,省略共用体类型名,同时定义共)定义共用体类型时,省略共用体类型名,同时定义共用体类型变量。用体类型变量。10.1.2 共用体变量的引用共用体变量的引用在定义共用体变量之后,就可以引用该共用体变量的某个成在定义共用体变量之后,就可以引用该共用体变量的某个成员,引用方式与引用结构体变量中的成员相似。员,引

3、用方式与引用结构体变量中的成员相似。但是应当注意,一个共用体变量不是同时存放多个成员的值,但是应当注意,一个共用体变量不是同时存放多个成员的值,而只能存放其中的一个值,这就是最后赋给它的值。例如:而只能存放其中的一个值,这就是最后赋给它的值。例如:A.I=278;A.CH=D;A.F=5.78;共用体变量共用体变量A中最后的值是中最后的值是5.78。所以不能企图通过下面的。所以不能企图通过下面的PRINTF函数得到函数得到A.I和和A.CH的值,但能得到的值,但能得到A.F的值。的值。PRINTF(“%D,%C,%F”,A.I,A.CH,A.F);也可以通过指针变量引用共用体变量中的成员,例如

4、:也可以通过指针变量引用共用体变量中的成员,例如:UNION DATA *PT,X;PT=&X;PT-I=278;PT-CH=D;PT-F=5.78;PT是指向是指向UNION DATA类型变量的指针变量,先使它指向类型变量的指针变量,先使它指向共用体变量共用体变量X。此时。此时PT-I相当于相当于X.I,这和结构体变量中的,这和结构体变量中的用法相似。用法相似。不能直接用共用体变量名进行输入不能直接用共用体变量名进行输入/输出。输出。【例例10.1】写出下列程序的执行结果。写出下列程序的执行结果。10.1.3 共用体变量的应用共用体变量的应用从前面的介绍可知,共用体虽然可以有多个成员

5、,但在某一从前面的介绍可知,共用体虽然可以有多个成员,但在某一时刻,只能使用其中的一个成员。共用体一般不单独使用,时刻,只能使用其中的一个成员。共用体一般不单独使用,通常作为结构体的成员,这样结构体可根据不同情况放不同通常作为结构体的成员,这样结构体可根据不同情况放不同类型的数据。类型的数据。例如,需要把学生和教师的数据放在一起处理。学生和教师例如,需要把学生和教师的数据放在一起处理。学生和教师的数据相同的部分有:姓名、编号和身份。但也有不同的部的数据相同的部分有:姓名、编号和身份。但也有不同的部分:学生需要保存分:学生需要保存10门课程的分数,分数用浮点数表示,教门课程的分数,分数用浮点数表

6、示,教师则保存工作情况简介,用字符串表示。教师和学生的不同师则保存工作情况简介,用字符串表示。教师和学生的不同部分可以用共用体描述。部分可以用共用体描述。10.2 枚枚 举举枚举类型定义的一般格式为:枚举类型定义的一般格式为:ENUM 枚举类型名标识符1,标识符2,标识符N;针对枚举类型有几点说明:针对枚举类型有几点说明:(1)ENUM是关键字,标识枚举类型,定义枚举类型必须是关键字,标识枚举类型,定义枚举类型必须以以ENUM开头。开头。(2)在定义枚举类型时,花括号中的名字称为枚举元素或)在定义枚举类型时,花括号中的名字称为枚举元素或枚举常量。它们是程序设计者自己指定的,定名规则与标识枚举常

7、量。它们是程序设计者自己指定的,定名规则与标识符相同。这些名字并无固定的含义,只是一个符号,程序设符相同。这些名字并无固定的含义,只是一个符号,程序设计者仅仅是为了提高程序的可读性才使用这些名字。计者仅仅是为了提高程序的可读性才使用这些名字。(3)枚举元素不是变量,不能改变其值。例如,下面这些)枚举元素不是变量,不能改变其值。例如,下面这些赋值是不对的:赋值是不对的:RED=8;YELLOW=9;但枚举元素作为常量,它们是有值的。从花括号的第一个元但枚举元素作为常量,它们是有值的。从花括号的第一个元素开始,值分别是素开始,值分别是0、1、2、3、4,这是系统自动赋给的,这是系统自动赋给的,可以

8、输出。可以输出。(4)枚举常量可以进行比较。)枚举常量可以进行比较。(5)一个枚举变量的值只能是这几个枚举常量之一,可以)一个枚举变量的值只能是这几个枚举常量之一,可以将枚举常量赋给一个枚举变量。但不能将一个整数赋给它。将枚举常量赋给一个枚举变量。但不能将一个整数赋给它。(6)枚举常量不是字符串,不能用下面的方法输出字符串)枚举常量不是字符串,不能用下面的方法输出字符串“RED”。【例例10.2】枚举类型应用举例。枚举类型应用举例。10.3 位运算与位段结构位运算与位段结构10.3.1 位运算位运算位运算符主要有:位运算符主要有:&,|,和和。(1)&(按位(按位“与与”)运算

9、规则为:运算规则为:0&0=0,0&1=0,1&0=0,1&1=1例如,例如,-5&3的值为的值为3。其中。其中-5的补码(为简便起见,用的补码(为简便起见,用8位二位二进制表示)为进制表示)为1111 1011,3的补码为的补码为0000 0011,按位与的结,按位与的结果为果为0000 0011,即值为十进制数,即值为十进制数3。(2)|(按位(按位“或或”)运算规则为:运算规则为:0|0=0,0|1=1,1|0=1,1|1=1例如,例如,-5|3的值为的值为-5。-5与与3按位或后得按位或后得11111011,其真值为,其真值为-0000101,即

10、,即-5。(3)(按位(按位“异或异或”)运算规则为:运算规则为:00=0,01=1,10=1,11=0例如,例如,-53的值为的值为-8。(4)(按位(按位“取反取反”)运算规则为:运算规则为:0=1,1=0例如,例如,7的值为的值为-8。(5)(左移)(左移)例如,例如,3(右移)(右移)移动对象为正数时,高位补移动对象为正数时,高位补0。为负数时,逻辑右移,高位。为负数时,逻辑右移,高位补补0;算术右移,高位补;算术右移,高位补1。VISUAL C+ 6.0和和TURBO C 2.0采用的是算术右移,有的采用的是算术右移,有的C语言版本则采用逻辑右移。语言版本则采用逻辑右移。例如,例如,

11、-32,将,将3右移右移2位,左边(最高位)补位,左边(最高位)补1,结果为,结果为-1。10.3.2 位段结构位段结构位段结构也是一种结构体类型,只不过其中含有以位为单位位段结构也是一种结构体类型,只不过其中含有以位为单位定义存储长度的整数类型位段成员。在某些应用中,特别是定义存储长度的整数类型位段成员。在某些应用中,特别是对硬件端口的操作,需要标志某些端口的状态或特征。而这对硬件端口的操作,需要标志某些端口的状态或特征。而这些状态或特征只需要一个机器字中的一位或连续若干位来表些状态或特征只需要一个机器字中的一位或连续若干位来表示。采用位段结构既节省存储空间,又可方便操作。示。采用位段结构既

12、节省存储空间,又可方便操作。位段结构中位段的定义格式为:位段结构中位段的定义格式为:UNSIGNED :对对16位的位的TURBO C 2.0而言,而言,DATA变量的内存分配示意图变量的内存分配示意图如图如图10-2所示。所示。图图10-2 data变量的内存分配示意图变量的内存分配示意图应该注意的是,应该注意的是,16位的位的TURBO C 2.0的字边界在的字边界在2倍字节处,倍字节处,其他的其他的C语言的字边界可能在若干倍字节处(如语言的字边界可能在若干倍字节处(如VISUAL C+ 6.0在在4倍字节处)。倍字节处)。位段数据的引用,同结构体成员中的数据引用一样,但应注位段数据的引用

13、,同结构体成员中的数据引用一样,但应注意位段的最大取值范围不要超出二进制位数确定的范围,否意位段的最大取值范围不要超出二进制位数确定的范围,否则超出部分会丢弃。则超出部分会丢弃。关于位段数据,注意以下几点:关于位段数据,注意以下几点:(1)一个位段必须存储在同一存储单元(即字)之中,不)一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空间不用,从能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。下一个单元起存放该位段。(2)可以通过定义长度为)可以通过定义长度为0的位段的方式使下一位段从下一的位段的方式使下一位段从下一存储单元开始

14、。存储单元开始。(3)可以定义无名位段。)可以定义无名位段。(4)位段的长度不能大于存储单元的长度。)位段的长度不能大于存储单元的长度。(5)位段无地址,不能对位段进行取地址运算。)位段无地址,不能对位段进行取地址运算。(6)位段可以以)位段可以以%D、%O、%X格式输出。格式输出。(7)位段若出现在表达式中,将被系统自动转换成整数。)位段若出现在表达式中,将被系统自动转换成整数。【例例10.3】试编一个程序,将一个十六进制整数(占试编一个程序,将一个十六进制整数(占2字节)字节)的各位循环左移的各位循环左移4个二进制位,如个二进制位,如2FE1循环左移循环左移4个二进制位个二进制位后为后为F

15、E12。10.4 用用TYPEDEF定义类型名定义类型名1简单的名字替换简单的名字替换例如:例如:TYPEDEF INT INTEGER;意思是将意思是将INT型定义为型定义为INTEGER,这两者等价,在程序中,这两者等价,在程序中就可以用就可以用INTEGER作为类型名来定义变量了。例如:作为类型名来定义变量了。例如:INTEGER X,Y; /* 相当于INT X,Y; */2定义一个类型名代表一个结构体类型定义一个类型名代表一个结构体类型3定义数组类型定义数组类型例如:例如:TYPEDEF INT COUNT20;COUNT A,B;定义定义COUNT为整型数组,为整型数组,A、B为为

16、COUNT类型的整型数组。类型的整型数组。4定义指针类型定义指针类型例如:例如:TYPEDEF CHAR *STRING;STRING P1,P2,P10;定义定义STRING为字符指针类型,为字符指针类型,P1、P2为字符指针变量,为字符指针变量,P为字符指针数组。为字符指针数组。还可以有其他方法。归纳起来,用还可以有其他方法。归纳起来,用TYPEDEF定义一个新类定义一个新类型名的方法如下:型名的方法如下:(1)先按定义变量的方法写出定义体(如)先按定义变量的方法写出定义体(如CHAR A20;)。)。(2)将变量名换成新类型名(如)将变量名换成新类型名(如CHAR NAME20;)。)。

17、(3)在最前面加上)在最前面加上TYPEDEF(如(如TYPEDEF CHAR NAME20;)。)。(4)然后可以用新类型名去定义变量(如)然后可以用新类型名去定义变量(如NAME C,D;)。)。 本本 章章 小小 结结1共用体数据类型是指将不同的数据项存放于同一段内存共用体数据类型是指将不同的数据项存放于同一段内存单元的一种构造数据类型。同定义结构体变量一样,定义共单元的一种构造数据类型。同定义结构体变量一样,定义共同体变量也有同体变量也有3种方式:先定义共用体类型,再定义共用体种方式:先定义共用体类型,再定义共用体类型变量;在定义共用体类型的同时定义共用体类型变量;类型变量;在定义共用

18、体类型的同时定义共用体类型变量;定义共用体类型时,省略共用体类型名,同时定义共用体类定义共用体类型时,省略共用体类型名,同时定义共用体类型变量。型变量。注意:注意:(1)共用体变量所占内存长度等于最长的成员的长度。)共用体变量所占内存长度等于最长的成员的长度。(2)不能直接引用共用体变量,只能引用共用体变量中的)不能直接引用共用体变量,只能引用共用体变量中的成员。引用格式为:成员。引用格式为:共用体变量.成员名(3)在同一段内存中可以用来存放几种不同类型的成员,)在同一段内存中可以用来存放几种不同类型的成员,但在每一瞬间只能存放其中一种,而不是同时存放几种。但在每一瞬间只能存放其中一种,而不是

19、同时存放几种。(4)共用体变量中起作用的成员是最后一次存放的成员,)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后原有成员就失去作用。引用共用体变在存入一个新的成员后原有成员就失去作用。引用共用体变量应注意当前存放在共用体变量中的究竟是哪一个成员。量应注意当前存放在共用体变量中的究竟是哪一个成员。(5)共用体变量的地址和它的各成员的地址都是同一个地)共用体变量的地址和它的各成员的地址都是同一个地址。址。2枚举类型是指变量的取值只能限于事前已经一一列举出枚举类型是指变量的取值只能限于事前已经一一列举出来的值的范围。定义枚举类型的格式为:来的值的范围。定义枚举类型的格式为:ENUM 枚举类型名(枚举常量列表);枚举变量的定义格式为:枚举变量的定义格式为:ENUM 枚举类型名 枚举变量名;注意注意(1)枚举常量是有值的,)枚举常量是有值的,C语言按定义时的顺序使它们的值语言按定义时的顺序使它们的值为为0,1,2,也可以改变枚举元素的值,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论