资源预览内容
第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
第9页 / 共24页
第10页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第11章 共用体及其它数据类型,11.1 共用体,11.2 枚举类型,11.3 用typedef定义类型,11.4 位段结构,11.1 共用体,11.1 共用体,一. 共用体的概念,当需要把不同类型的变量存放到同一段内存单元,或对同一段内存单元的数据按不同类型处理,则需要使用“共用体”数据结构。,共用体数据类型是指将不同的数据项组织为一个整体,它们在内存中占用同一段存储单元。,1. 共用体类型定义,共用体类型定义的一般形式:union 共用体名 成员表列;,2000,2001,2002,2003,ch,i,f,例: union data char ch; int i; float f;;,覆盖技术,11.1 共用体,2. 定义共用体类型的变量,(1)先定义类型,再定义变量,例如: union data /*共用体类型定义*/ int i; char ch; float f; ; union data a,b,c;/*共用体类型变量定义*/,11.1 共用体,二. 共用体变量的引用方式,对共用体变量的引用,是通过其成员的引用来实现的。,a.i /*引用共用体变量中的成员i,a.i就相当于一个整型变量*/ a.ch /*引用共用体变量中的成员ch,a.ch就相当于一个字符变量*/ a.f /*引用共用体变量中的成员f,a.f就相当于一个实型变量*/,不能对共用体变量进行整体的输入输出,例如: printf(”%d”,a);,11.1 共用体,【例11-1】共用体变量引用。 #include void main() union char a; int b; long c; uu; uu.a=0 x61; printf(”n1:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); uu.b=0 x7656; printf(”n2:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); uu.c=0 x12345678; printf(”n3:a=%x,b=%x,c=%lx”,uu.a,uu.b,uu.c); ,11.1 共用体,三. 共用体变量的应用,【例11-2】设有若干个人员的数据,其中有学生和教师。学生数据包括:姓名、号码、性别、职业、班级。教师数据包括:姓名、号码、性别、职业、职务;如表11-1所示。要求输入人员数据,然后输出。,11.1 共用体,分析: (1)学生和教师都属于复杂数据,应该定义为结构体类型。 (2)如果将学生和教师分别存放在不同的表格(即结构体数组)中,可以定义两个不同类型的结构体数组。 (3)如果将学生和教师存放在同一表格(即结构体数组)中,可将“班级”和“职务”作为两个成员。但这样一来,对于学生,“职务”成员就闲置了,对于教师“班级”成员就闲置了,从而导致存储空间的浪费。最好的解决办法就是使“职务”和“班级”占据同一存储单元,对于教师,在该存储单元写入其“职务”,对于学生,在该存储单元写入“班级”。也就是说,定义一个共用体类型的变量。,11.1 共用体,11.2 枚举类型,在处理实际问题时,常常要涉及到一些非数值性数据,而这些数据难以用前面介绍的标准类型准确描述,只好采用一些替代方法。, 性别有男女之分,用整数0、1分别表示;,例如:, 红、橙、黄、绿、青、蓝、紫七种颜色,用1、2、3、4、5、6、7分别表示;, 一周有七天,以0、1、2、3、4、5、6分别表示;一年有12个月,用112分别表示。,11.2 枚举类型,显然,这种用数值代码来代表某一具体非数值数据的方法在程序设计中属于个别约定,虽可采用,但使用起来有诸多的不便:,一方面这种描述方法不易明确数据与代码的对应关系,不直观,可读性差;,另一方面,这些数值代码的整数形式容易混淆其真实含义,对这些数字代码进行的某些语法正确的运算,可能毫无意义,更可能导致不必要的错误。,所谓枚举,是将具有相同属性的一类数据值一一列举。,枚举类型是ANSI C新标准所增加的,它是C语言中的简单类型而非构造类型,它的值域是有穷的,可以一一列举出来,变量的取值只限于列举出来的值的范围。,11.2 枚举类型,一. 枚举类型的定义,1. enum 枚举类型名 标识符1,标识符2,标识符n;,enum是枚举类型定义的关键字,枚举类型名是用户命名的标识符,它与enum构成枚举类型的标识符,花括号中“标识符1,标识符2,标识符n”是所定义枚举类型的全部取值,通常称这些标识符为“枚举元素“或“枚举常量”。这些标识符是用户定义的标识符,一般是所代表事物的名称,但这些标识符并不自动地代表事物本身。,例如,enum colorred,blue,green,black;,11.2 枚举类型,用户可根据需要在定义时直接指定某一枚举元素的编号,从而改变量系统默认的编号。例如: enum week sun=7,mon,tue=2,wed,thu,fri,sat; 则sun的序号为7,mon的序号为8, tue的序号为2, wed的序号为3, thu的序号为4,fri的序号为5,sat的序号为6。,2. 枚举类型是有序类型,一般地,枚举类型中各枚举元素按定义时的先后次序分别编号为0、1、2、.、n-1。,例如:,redblue 值为真,各枚举元素可根据其序号进行大小比较和相应的运算,green-red,值为2,11.2 枚举类型,二. 枚举类型的应用,1枚举类型变量的定义,enum male,femalesex1,sex2;,先定义枚举类型,再定义枚举类型变量,enum weeksun,mon,tue,wed,thu,fri,sat; enum week weekday,workday;,定义枚举类型的同时定义枚举变量,enum color red,blue,green,blacka,b,c;,直接定义枚举变量,11.2 枚举类型,2枚举变量的输入/输出,枚举变量的值不能直接输入/输出,要输入性别: printf(”enter male(0),female(1):”); scanf(”%d”,break; case tue:printf(”tue-study mathn ”);break; case wed:printf(”tue-study englishn ”);break; case thu:printf(”thu-study musicn ”);break; case fri:printf(”fri-study chemistryn ”);break; ,11.2 枚举类型,11.3 用typedef定义类型,语言允许用typede定义新的类型名来代替已有的类型名。,用typedef定义新类型的一般形式为:,typedef 类型标识符1 类型标识符2;,标准类型或用户已定义标识符,新的类型的标识符,11.3 typedef,在程序中,用户可以同时使用原有的类型名和新创建的类型名来定义变量。,用typedef定义了一个新的类型名,但它并没有创建类型。,它只是对已存在的类型创建了一个新的称呼,即新的类型名。,创建这个新的类型名可能是为了使类型名的引用更简单、方便(如对结构体、共用体等创建新的类型),也可能是为了使类型名的引用更符合某些人的习惯和喜好,11.3 typedef,例如: typedef int INTEGER; typedef float REAL; 指定用INTEGER代表int类型,REAL代表float 。 这样,以下两行等价: int i,j; float a,b; INTEGER i,j; REAL a,b;,定义一个新的类型名的基本方法是: (1)先按定义变量的方法写出定义体(如:int i;)。 (2)在最前面加typedef(如:typedef int i)。 (3)将变量名换成新类型名(如:将i换成COUNT,即typedef int COUNT)。 (4)然后可以用新类型名说明变量.,11.3 typedef,11.4 位段结构,位段(又称为位域)是一种特殊的结构体成员或共用体成员(它只能用在结构体或共用体中),它通过指定成员在内存存储时占用的位数(二进制位),使数据在内存的存储更为紧凑。,位段结构定义的一般形式为: struct/union 位段名 unsigned :; unsigned :; unsigned :; ;,11.3 位段结构,struct data_struct unsigned int f1:1; unsigned int f2:1; unsigned int f3:1; unsigned int opcode1:3; unsigned int opcode2:4; unsigned int opcode3:6; ;,data_struct为结构体名,它有6个成员,如第一个成员f1是一个无符号的整数,其后的“:1”表明该成员占据1“位”的存储空间。 这种方法的好处在于对压缩的数据值存取可采用结构成员方法,这样做起来方便。,11.3 位段结构,对位段的操作与对相应的结构体的操作相似。 例如: struct data_struct data; /*定义一个位段结构变量data*/ data.opcode1=n; /*给data的opcode1赋值为n*/ m=data.opcode1; /*从data中提取opcode1域的值,并赋给变量m*/,11.3 位段结构,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号