C语言共用体与枚举.ppt_第1页
C语言共用体与枚举.ppt_第2页
C语言共用体与枚举.ppt_第3页
C语言共用体与枚举.ppt_第4页
C语言共用体与枚举.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第12章 共用体与枚举类型 12.1 共用体类型与共用体变量 12.2 共用体变量的引用 12.3 共用体变量的应用 12.4 位运算与位段结构 12.5 枚举类型 12.6 类型定义 第十二章第十二章 共用体与枚举类型共用体与枚举类型 Date 1 语言程序设计教程 第12章 共用体与枚举类型 12.1 共用体类型与共用体变量 共用体是由用户定义的数据类型。 有时需要使几种不同类别的变量存放到同一段 内存单元中,也就是使用覆盖技术,几个变量互相覆 盖。这种使几个不同的变量共同占用一段内存单元 的结构,称为“共用体”类型的结构。 1. 共用体类型定义的一般形式 共用体类型定义用关键字union标识, 形式为: union 标识符 成员说明列表 ; Date 2 语言程序设计教程 第12章 共用体与枚举类型 标识符给出共用体名, 是共用体类型名的主体, 定义的共用体类型由“union 标识符”标识。 2.共用体变量的定义 (1) 先定义共用体类型, 再定义共用体变量: union 共用体名 成员表 ; union 共用体名 变量表 ; union data int i; char ch; float f; ; union data a,b,c; Date 3 语言程序设计教程 第12章 共用体与枚举类型 (2) 定义共用体类型的同时定义共用体变量 union 共用体名 成员表 变量表; union data int i; char ch; float f; a,b,c; (3)定义共用体类型时,省略共用体类型名,同时定 义共用体类型变量 union 成员表 变量表; union int i; char ch; float f; a,b,c; Date 4 语言程序设计教程 第12章 共用体与枚举类型 注意区分: “共用体”变量:各成员占相同的起始地址,在内 存中所占字节数度等于最长的成员在内存中所占的字 节数。 “结构体”变量:各成员占不同的地址,在内存中所 占字节数等于全部成员在内存中所占的字节数之和。 union int i; char ch; float f; b; struct int i; char ch; float f; a; Date 5 语言程序设计教程 第12章 共用体与枚举类型 12.2 共用体变量的引用 共用体变量不能直接使用,和结构体变量一 样只能使用里面的某个成员,其成员同样通过点 运算描述。形式为: 共用体变量名.成员名 union int i; char ch; float f; a; 例如:左边定义的共用体 类型变量a ,a占有4个字节的 空间,a.i 表示其整型成员, a.ch表示其字符型成员,a.f表 示其单精度型成员。 Date 6 语言程序设计教程 第12章 共用体与枚举类型 说明: (1) 共用体变量中,可以包含若干个成员及若干 种类型,但共用体成员不能同时使用。在每一时刻, 只有一个成员及一种类型起作用,不能同时引用多个 成员及多种类型。 (2) 共用体变量中起作用的成员值是最后一次存 放的成员值,因为共用体变量所有成员共同占用同一 段内存单元,后来存放的值将原先存放的值覆盖,故 只能使用最后一次给定的成员值。如: a.i=278, a.ch=D, a.f=5.78; 不能企图通过下面的printf函数得到a.i和a.ch的值: printf(“%d,%c,%f”, a.i, a.ch, a.f); 但能得到a.f的值。 Date 7 语言程序设计教程 第12章 共用体与枚举类型 (3) 共用体变量的地址和它的各个成员的地址相同。 (4) 不能企图引用共用体变量名来得到某成员的值。 (5) 共用体变量不能作函数参数,函数的返回值也不 能是共用体类型。 (6) 共用体类型和结构体类型可以相互嵌套,共用体 中成员可以为数组,甚至还可以定义共用体数组。 Date 8 语言程序设计教程 第12章 共用体与枚举类型 例12.1 写出下列程序的执行结果 main() union exx int a,b; struct int c,d;lpp; e=10; e.b=e.a+20; e.lpp.c=e.a+e.b; e.lpp.d=e.a*e.b; printf(“%d,%dn”,e.lpp.c,e.lpp.d); 程序运行结果如下: 60,3600 Date 9 语言程序设计教程 第12章 共用体与枚举类型 12.3 共用体变量的应用 例12.2 设有若干教师的数据,包含有教师编号、姓名 、职称,若职称为讲师,则描述他们的所讲课程,若 职称为教授,则描述他们所写论文数目。 union cf char clname10; /*所讲课程*/ int num; /*论文数目*/ ; struct teachers int no; /*编号*/ char name12; /*姓名*/ char zc; /*职称*/ union cf x; /*可变字段, 为所讲课程或论文数目*/ teach3; Date 10 语言程序设计教程 第12章 共用体与枚举类型 #define format %d %s %c main( ) int i; for(i=0; i (1)格式:x位数 (2)规则:使操作数的各位右移,移出的低位舍弃; 高位: 1)对无符号数和有符号中的正数,补0; 2)有符号数中的负数,取决于所使用的系统:补0的 称为“逻辑右移”,补1的称为“算术右移”。例如,20 2=5。 Date 17 语言程序设计教程 第12章 共用体与枚举类型 说明: (1)x、y和“位数”等操作数,都只能是整型或字符 型数据。除按位取反为单目运算符外,其余均为双目 运算符。 (2)参与运算时,操作数x和y,都必须首先转换成 二进制形式,然后再执行相应的按位运算。 例如,5 2=5:10100 00101。 Date 18 语言程序设计教程 第12章 共用体与枚举类型 12.4.2 位运算举例 例12.3 从键盘上输入1个正整数给int变量num,输出 由811位构成的数(从低位、0号开始编号)。 基本思路: (1)使变量num右移8位,将811位移到低4位上。 (2)构造1个低4位为1、其余各位为0的整数。 (3)与num进行按位与运算。 main() int num, mask; printf(“Input a integer number: “); scanf(“%d“, num=8; mask = ( 0 = (2)不同长度数据间的位运算低字节对齐, 短数的 高字节按最高位补齐: 对无符号数和有符号中的正数,补0; 有符号数中的负数,补1。 Date 20 语言程序设计教程 第12章 共用体与枚举类型 12.4.3 位段结构 有时,存储1个信息不必占用1个字节,只需二进制 的1个或多个位就够用。如果仍然使用结构类型,则造 成内存空间的浪费。为此,C语言引入了位段类型。 1. 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有 成员均以二进制位为单位定义长度,并称成员为位段 。 位段结构中位段的定义格式为: unsigned : 例如,CPU的状态寄存器,按位段类型定义如下: Date 21 语言程序设计教程 第12章 共用体与枚举类型 struct status unsigned sign: 1; /*符号标志*/ unsigned zero: 1; /*零标志*/ unsigned carry: 1; /*进位标志*/ unsigned parity: 1; /*奇偶/溢出标志*/ unsigned half_carry: 1; /*半进位标志*/ unsigned negative: 1; /*减标志*/ flags; 显然,对CPU的状态寄存器而言,使用位段类型( 仅需1个字节),比使用结构类型(需要6个字节)节 省了5个字节。 Date 22 语言程序设计教程 第12章 共用体与枚举类型 2.说明 (1)因为位段类型是一种结构类型,所以位段类型 和位段变量的定义,以及对位段(即位段类型中的成 员)的引用,均与结构类型和结构变量一样。 (2)对位段赋值时,要注意取置范围。一般地说, 长度为n的位段,其取值范围是:0(2n-1)。 (3)可以用%d、%x、%u和%o等格式字符,以整 数形式输出位段。 (4)在数值表达式中引用位段时,系统自动将位段 转换为整型数。 Date 23 语言程序设计教程 第12章 共用体与枚举类型 12.5 枚举类型 如果一个变变量只有几种可能的值值,可以定义为义为 枚 举类举类 型。 “枚举举”:将变变量可能的值值一一列举举出来。变变量 的值值只能取列举举出来的值值之一。 1.枚举类型的定义 2. 枚举类型定义用关键字enum标识,形式为: enum 枚举名标识符=整常数, 枚举变 量名; 枚举元素(非一般意义上的常量,也不是变量,而 只是一个符号),只能是标识符,而不能是字符常量 或符号常量,标识符代表什么含义,完全由程序员决 定。数据枚举的顺序规定了枚举数据的序号,从0开 始,依次递增。 Date 24 语言程序设计教程 第12章 共用体与枚举类型 (1) 定义枚举类型status, 包含复制与删除两种状态: enum statuscopy, delete; 枚举类型status仅有两个数据,一个是copy,一个 是delete, 序号为0、 1, 代表复制与删除。 (2) 定义枚举类型color,包含红、黄、蓝、白、黑五 种颜色: enum color red, yellow, blue, white, black; 枚举类型color有red、 yellow、 blue、 white、 black五个数据, 序号为0、 1、 2、 3、 4, 代表红、 黄、 蓝、 白、 黑五种颜色。 在定义枚举类型时,程序员可在枚举数据时通过 “=”号自己规定序号,并影响后面的枚举数据的序号 ,后继序号以此递增。例如:enum statucopy=6, delete;则copy的序号为6, delete的序号为7。 Date 25 语言程序设计教程 第12章 共用体与枚举类型 2. 枚举类型变量的定义 (1) 先定义枚举类型, 再定义枚举类型变量: enum 标识符 枚举数据表; enum 标识符 变量表; 例如: enum color red,yellow, blue, white, black; enum color c1, c2; (2) 在定义枚举类型的同时定义枚举类型变量: enum 标识符 枚举数据表 变量表; 例如: enum color red,yellow,blue,white,black c1, c2; Date 26 语言程序设计教程 第12章 共用体与枚举类型 (3) 直接定义枚举类型变量: enum 枚举数据表 变量表; enum red,yellow, blue,white, black c1, c2; 说明: (1)枚举举元素是常量,不是变量。在中按定义义的顺顺 序取值值0、1、. 例:c1 = yellow; printf(“%d“, c1); 输输出整数1。 (2)枚举类型变量可以进行赋值运算。枚举类型是有 序类型, 枚举类型数据还可以进行关系运算。枚举类 型数据的比较转化成对序号进行比较, 只有同一种枚 举类型的数据才能进行比较。 如:if(c1=c2) printf(“n%s”,”The color is same”); if(c1=red) printf(“n%s”,”red”); Date 27 语言程序设计教程 第12章 共用体与枚举类型 12.6 类型定义 除了可以直接使用C提供的标标准类类型名(如 int,char,float)和自己声明的结结构体、共用体、指 针针、枚举类举类 型外,还还可以用typedef声明新的类类型名 来代替已有的类类型名。如: (1)typedef int integer; 指定用integer代替int类类型,这样这样 integer j,k;等价于 int j,k; (2)typedef int arr5; 指定用arr代替一个包含5个整数的整型数组, 这样arr a,b;等价于int a5,b5; Date 28 语言程序设计教程 第12章 共用体与枚举类型 (3)typedef struct node long num; char name10; struct node *next; node,*link; 指定用node代替上述结构体类型,用link代 替结构体指针类型,这样node stu1,stu2;等价于 struct node stu1,stu2;而link p,q;等价于 struct node *p,*q;或 node *p,*q; Date 29 语言程序设计教程 第12章 共用体与枚举类型 归纳起来,声明一个新的类型名的方法是 先按定义变量的方法写出定义体(如:int j;)。 将变量名换成新类型名(如:将j换成integer)。 在最前面加typedef(如:typedef int integer;)。 然后可以用新类型名去定义变量。 再以定义上述的数组类型为例来说明: 先按定义数组变量形式书写:int a10; 将变量名a换成自己指定的类

温馨提示

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

评论

0/150

提交评论