版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举112.1 12.1 共用体类型与共用体变量共用体类型与共用体变量12.2 12.2 共用体变量的引用共用体变量的引用12.3 12.3 共用体变量的应用共用体变量的应用12.4 12.4 位运算与位段结构位运算与位段结构12.5 12.5 枚举类型枚举类型12.6 12.6 类型定义类型定义第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举212.1 12.1 共用体类型与共用体变量共用体类型与共用体变量 共用体是由共用体是由用户定义用户定义的数据类型。的数据类型。 有时
2、需要使几种不同类别的变量存放到同一段有时需要使几种不同类别的变量存放到同一段内存单元中内存单元中, ,也就是使用也就是使用覆盖覆盖技术,几个变量互相覆技术,几个变量互相覆盖。这种使几个不同的变量共同占用一段内存单元盖。这种使几个不同的变量共同占用一段内存单元的结构,称为的结构,称为“共用体共用体”类型的结构。类型的结构。1 1. 共用体类型定义的一般形式共用体类型定义的一般形式共用体类型定义用关键字共用体类型定义用关键字union标识,标识, 形式为:形式为: union 标识符标识符 成员说明列表成员说明列表; 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体
3、与枚举3 标识符给出共用体名,标识符给出共用体名, 是共用体类型名的主体,是共用体类型名的主体, 定义的共用体类型由定义的共用体类型由“union 标识符标识符”标识。标识。2.共用体变量的定义共用体变量的定义 (1) 先定义共用体类型,先定义共用体类型, 再定义共用体变量:再定义共用体变量: union 共用体名共用体名 成员表成员表;union 共用体名共用体名 变量表;变量表;union data int i; char ch; float f;union data a,b,c;第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举4(2) 定义共用体类型
4、的同时定义共用体变量定义共用体类型的同时定义共用体变量union 共用体名共用体名 成员表成员表 变量表;变量表;union data int i; char ch; float f;a,b,c;(3)定义共用体类型时,省略共用体类型名,同时定定义共用体类型时,省略共用体类型名,同时定义共用体类型变量义共用体类型变量unionunion 成员表成员表 变量表;变量表;union int i; char ch; float f;a,b,c;第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举5注意区分:注意区分: “共用体共用体”变量:变量:各成员占相同的起始地
5、址,在内各成员占相同的起始地址,在内存中所占字节数度等于最长的成员在内存中所占的字存中所占字节数度等于最长的成员在内存中所占的字节数。节数。 “结构体结构体”变量:变量:各成员占不同的地址,在内存中所各成员占不同的地址,在内存中所占字节数等于全部成员在内存中所占的字节数之和。占字节数等于全部成员在内存中所占的字节数之和。union int i; char ch; float f; b;struct int i; char ch; float f;a;第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举612.2 12.2 共用体变量的引用共用体变量的引用 共用
6、体变量不能直接使用,和结构体变量一共用体变量不能直接使用,和结构体变量一样只能使用里面的某个成员,其成员同样通过样只能使用里面的某个成员,其成员同样通过点点运算运算描述。形式为:描述。形式为: 共用体变量名共用体变量名. .成员名成员名 union int i; char ch; float f;a; 例如:左边定义的共用体例如:左边定义的共用体类型变量类型变量a a ,a a占有占有4 4个字节的个字节的空间,空间,a.i a.i 表示其整型成员,表示其整型成员,a.cha.ch表示其字符型成员,表示其字符型成员,a.fa.f表示其单精度型成员。表示其单精度型成员。 第第1212章章 共用体
7、与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举7 说明:说明: (1) 共用体变量中,可以包含若干个成员及若干共用体变量中,可以包含若干个成员及若干种类型,但种类型,但共用体成员不能同时使用共用体成员不能同时使用。在每一时刻,。在每一时刻,只有一个成员及一种类型起作用,不能同时引用多只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型。个成员及多种类型。 (2) 共用体变量中起作用的成员值是最后一次存共用体变量中起作用的成员值是最后一次存放的成员值放的成员值,因为共用体变量所有成员共同占用同,因为共用体变量所有成员共同占用同一段内存单元,后来存放的值将原先存放的值覆盖,
8、一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。如:故只能使用最后一次给定的成员值。如: 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的值。的值。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举8(3) 共用体变量的地址和它的各个成员的地址相同。共用体变量的地址和它的各个成员的地址相同。 (4) 不能企图引用共用体变量名来得到某成员的
9、值。不能企图引用共用体变量名来得到某成员的值。 (5) 共用体变量不能作函数参数,函数的返回值也不共用体变量不能作函数参数,函数的返回值也不能是共用体类型。能是共用体类型。 (6) 共用体类型和结构体类型可以相互嵌套,共用体共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组。中成员可以为数组,甚至还可以定义共用体数组。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举9例例12.1 写出下列程序的执行结果写出下列程序的执行结果main() union exx int a,b; struct int c,d;lpp; e=10
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,360060,3600第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举1012.3 12.3 共用体变量的应用共用体变量的应用 例例12.2 设有若干教师的数据,包含有教师编号、姓名、设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职职称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。称为教授,则描
11、述他们所写论文数目。 union cfchar clname10; /*所讲课程所讲课程*/int num; /*论文数目论文数目*/; struct teachers int no; /*编号编号*/ char name12; /*姓名姓名*/ char zc; /*职称职称*/ union cf x; /*可变字段,可变字段, 为所讲课程或论文数目为所讲课程或论文数目*/ teach3;第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举11#define format %d %s %c main( )int i; for(i=0; i3; i+) sca
12、nf(format,&teachi.no,, &teachi.zc); if ( teachi.zc= =L) scanf(”%s”, teachi.x .clname);); else if (teachi.zc= =P) scanf (”%d”, &teachi.x .num);); else printf (”input data errorn”);); 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举12for(i=0; i3; i+) printf ( %d %s %c , teachi.no,tea
13、,teachi.zc);); if (teachi.zc= =L) printf (”%sn”, teachi.x.clname);); else if ( teachi. zc= = P ) printf (%dn, teachi.x. num); else printf(data errorn);); 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举1312.4 12.4 位运算与位段结构位运算与位段结构 为了节省内存空间,在系统软件中常将多个标为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)志状态
14、简单地组合在一起,存储到一个字节(或字)中。语言是为研制系统软件而设计的,所以它提中。语言是为研制系统软件而设计的,所以它提供了实现将标志状态从标志字节中分离出来的位运供了实现将标志状态从标志字节中分离出来的位运算功能。算功能。 所谓位运算是指,按二进制位进行的运算。所谓位运算是指,按二进制位进行的运算。在用在用位运算符进行数的运算时,数是以位运算符进行数的运算时,数是以补码补码的形式参加的形式参加运算的。运算的。12.4.1 12.4.1 位运算及其运算符位运算及其运算符第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举141按位与按位与& (1)
15、格式:格式:x&y (2)规则:对应位均为规则:对应位均为1时才为时才为1,否则为,否则为0:例如,例如,3&9=1: 0011 & 1001 0001=1 (3)主要用途:取主要用途:取(或保留或保留)1个数的某个数的某(些些)位,其余各位,其余各位置位置0。 2按位或按位或| (1)格式:格式:x|y (2)规则:对应位均为规则:对应位均为0时才为时才为0,否则为,否则为1: 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举15例如,例如,3|9=11: 0011 | 1001 1011=11 (3)主要用途:将主要用途:将1个
16、数的某个数的某(些些)位置位置1,其余各位,其余各位不变。不变。3按位异或按位异或(1)格式:格式:xy(2)规则:对应位相同时为规则:对应位相同时为0,不同时为,不同时为1:39=10。(3)主要用途:使主要用途:使1个数的某个数的某(些些)位翻转位翻转(即原来为即原来为1的的位变为位变为0,为,为0的变为的变为1),其余各位不变。,其余各位不变。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举164按位取反按位取反(1)格式:格式:x(2)规则:各位翻转,即原来为规则:各位翻转,即原来为1的位变成的位变成0,原来,原来为为0的位变成的位变成1:例如,直
17、接构造一个全:例如,直接构造一个全1的数,在的数,在IBM-PC机中为机中为0 xffff(2字节),而在字节),而在VAX-11/780上,上,却是却是0 xffffffff(4字节)。如果用字节)。如果用0来构造,系统可以来构造,系统可以自动适应。自动适应。5按位左移按位左移(1)格式:格式:x 位数位数(2)规则:使操作数的各位左移,低位补规则:使操作数的各位左移,低位补0,高位溢,高位溢出:出:5(1)格式:格式:x位数位数(2)规则:使操作数的各位右移,移出的低位舍弃;规则:使操作数的各位右移,移出的低位舍弃;高位:高位:1)对无符号数和有符号中的正数,补对无符号数和有符号中的正数,
18、补0;2)有符号数中的负数,取决于所使用的系统:补有符号数中的负数,取决于所使用的系统:补0的称为的称为“逻辑右移逻辑右移”,补,补1的称为的称为“算术右移算术右移”。例如,。例如,20 2=5。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举18说明说明:(1)x、y和和“位数位数”等操作数,都只能是整型或等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为字符型数据。除按位取反为单目运算符外,其余均为双目运算符。双目运算符。(2)参与运算时,操作数)参与运算时,操作数x和和y,都必须首先转换,都必须首先转换成二进制形式,然后再执行相应
19、的按位运算。成二进制形式,然后再执行相应的按位运算。例如,例如,5 2=5:10100 00101。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举1912.4.2 位运算举例位运算举例 例例12.3 从键盘上输入从键盘上输入1个正整数给个正整数给int变量变量num,输出,输出由由811位构成的数(从低位、位构成的数(从低位、0号开始编号)。号开始编号)。基本思路:基本思路:(1)使变量)使变量num右移右移8位,将位,将811位移到低位移到低4位上。位上。(2)构造)构造1个低个低4位为位为1、其余各位为、其余各位为0的整数。的整数。(3)与)与num
20、进行按位与运算。进行按位与运算。main() int num, mask; printf(Input a integer number: ); scanf(%d,&num); num=8; mask = ( 0 4); printf(result=0 x%xn, num & mask); 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举20说明说明:(1)(1)复合赋值位运算符复合赋值位运算符 除按位取反运算外,其余除按位取反运算外,其余5 5个位运算符均可个位运算符均可与赋值运算符一起,构成复合赋值位运算符:与赋值运算符一起,构成复合赋值
21、位运算符: &=&=、|=|=、=、=(2)(2)不同长度数据间的位运算不同长度数据间的位运算低字节对齐,低字节对齐,短数的短数的 高字节按最高位补齐:高字节按最高位补齐: 对无符号数和有符号中的正数,补对无符号数和有符号中的正数,补0 0; 有符号数中的负数,补有符号数中的负数,补1 1。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举2112.4.3 位段结构位段结构 有时,存储有时,存储1个信息不必占用个信息不必占用1个字节,只需二进个字节,只需二进制的制的1个或多个位就够用。如果仍然使用结构类型,则个或多个位就够用。如果仍然使用结构
22、类型,则造成内存空间的浪费。为此,造成内存空间的浪费。为此,C语言引入了位段类型。语言引入了位段类型。 1. 位段的概念与定义位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。成员均以二进制位为单位定义长度,并称成员为位段。位段结构中位段的定义格式为:位段结构中位段的定义格式为: unsigned :例如,例如,CPU的状态寄存器,按位段类型定义如下:的状态寄存器,按位段类型定义如下:第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举22struct stat
23、us unsigned sign: 1; /*符号标志符号标志*/ unsigned zero: 1; /*零标志零标志*/ unsigned carry: 1; /*进位标志进位标志*/ unsigned parity: 1; /*奇偶奇偶/溢出标志溢出标志*/ unsigned half_carry: 1; /*半进位标志半进位标志*/ unsigned negative: 1; /*减标志减标志*/ flags;显然,对显然,对CPU的状态寄存器而言,使用位段类型的状态寄存器而言,使用位段类型(仅需(仅需1个字节),比使用结构类型(需要个字节),比使用结构类型(需要6个字节)个字节)节省
24、了节省了5个字节。个字节。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举232.说明说明(1)因为位段类型是一种结构类型,所以位段类型)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。员)的引用,均与结构类型和结构变量一样。(2)对位段赋值时,要注意取置范围。一般地说,)对位段赋值时,要注意取置范围。一般地说,长度为长度为n的位段,其取值范围是:的位段,其取值范围是:0(2n-1)。)。(3)可以用)可以用%d、%x、%u和和%o等
25、格式字符,以整等格式字符,以整数形式输出位段。数形式输出位段。(4)在数值表达式中引用位段时,系统自动将位段)在数值表达式中引用位段时,系统自动将位段转换为整型数。转换为整型数。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举2412.5 12.5 枚举类型枚举类型 如果一个变量只有几种可能的值,可以定义为枚如果一个变量只有几种可能的值,可以定义为枚举类型。举类型。 “枚举枚举”:将变量可能的值一一列举出来。变量:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。的值只能取列举出来的值之一。枚举类型的定义枚举类型的定义 枚举类型定义用关键字枚举类
26、型定义用关键字enum标识,形式为:标识,形式为: enum 枚举名枚举名标识符标识符=整常数整常数, 枚举变枚举变量名量名; 枚举元素(非一般意义上的常量,也不是变量,枚举元素(非一般意义上的常量,也不是变量,而只是一个符号)而只是一个符号), ,只能是标识符,而不能是字符常只能是标识符,而不能是字符常量或符号常量,量或符号常量,标识符代表什么含义,完全由程序员标识符代表什么含义,完全由程序员决定决定。数据枚举的顺序规定了枚举数据的序号,从。数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。开始,依次递增。 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用
27、体与枚举25(1) 定义枚举类型定义枚举类型status, 包含复制与删除两种状态:包含复制与删除两种状态: enum statuscopy, delete; 枚举类型枚举类型status仅有两个数据,一个是仅有两个数据,一个是copy,一个,一个是是delete, 序号为序号为0、 1, 代表复制与删除。代表复制与删除。(2) 定义枚举类型定义枚举类型color,包含红、黄、蓝、白、黑五,包含红、黄、蓝、白、黑五种颜色:种颜色: enum color red, yellow, blue, white, black; 枚举类型枚举类型color有有red、 yellow、 blue、 whit
28、e、 black五个数据,五个数据, 序号为序号为0、 1、 2、 3、 4, 代表红、代表红、 黄、黄、 蓝、蓝、 白、白、 黑五种颜色。黑五种颜色。 在定义枚举类型时,在定义枚举类型时,程序员可在枚举数据时通过程序员可在枚举数据时通过“=”号自己规定序号号自己规定序号,并影响后面的枚举数据的序号,并影响后面的枚举数据的序号,后继序号以此递增。例如后继序号以此递增。例如:enum statucopy=6, delete;则;则copy的序号为的序号为6, delete的序号为的序号为7。第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举262. 枚举类型变
29、量的定义枚举类型变量的定义 (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; 第第121
30、2章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举27 (3) 直接定义枚举类型变量:直接定义枚举类型变量: enum 枚举数据表枚举数据表 变量表;变量表; enum red,yellow, blue,white, black c1, c2; 说明:说明: (1)枚举元素是常量枚举元素是常量,不是变量。不是变量。在中按定义的顺序在中按定义的顺序取值取值0、1、. 例例:c1 = yellow; printf(%d, c1); 输出整数输出整数1。 (2)枚举类型变量可以进行赋值运算。枚举类型是有枚举类型变量可以进行赋值运算。枚举类型是有序类型,序类型, 枚举类型数据
31、还可以进行关系运算。枚举类枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较,型数据的比较转化成对序号进行比较, 只有同一种枚只有同一种枚举类型的数据才能进行比较。举类型的数据才能进行比较。 如:如:if(c1=c2) printf(“n%s”,”The color is same”); if(c1=red) printf(“n%s”,”red”);第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举2812.6 类型定义类型定义 除了可以直接使用除了可以直接使用C C提供的标准类型名(如提供的标准类型名(如int,char,float)i
32、nt,char,float)和自己声明的结构体、共用体、指和自己声明的结构体、共用体、指针、枚举类型外,还可以用针、枚举类型外,还可以用typedeftypedef声明声明新的类型名新的类型名来代替已有的类型名来代替已有的类型名。如:。如: (1)typedef int integer;(1)typedef int integer; 指定用指定用integerinteger代替代替intint类型,这样类型,这样integer j,k;integer j,k;等价于等价于 int j,k;int j,k;(2)typedef int arr5;(2)typedef int arr5; 指定用指定用arr代替一个包含代替一个包含5个整数的整型数组,这个整数的整型数组,这样样arr a,b;等价于等价于int a5,b5; 第第1212章章 共用体与枚举类型共用体与枚举类型2022-1-10C语言共用体与枚举29(3)typedef struct node long num; char name10; struct node *next;node,*link; 指定用指定用nodenode代替上述结构体类型,用代替上述结构体类型,用li
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023-2024学年高一秋学期期末语文模拟测试(一)试题
- 放射工作人员法律法规培训
- 心理健康教育心得体会(15篇)
- 智研咨询-2024年中国储能电站EMS系统行业市场全景调查、投资策略研究报告
- 群智感知人机混合场景下数据收集方法的研究与实现
- 一回路关键能动设备故障诊断及剩余寿命预测技术研究与应用
- 宽带光电探测器的研制
- 2021高考物理备考模拟试题带答案解析六套汇编
- 国家安全你我同行主题班会
- 二零二五版交通枢纽停车场租用与交通组织合同3篇
- 2024-2025学年人教版数学六年级上册 期末综合卷(含答案)
- 2024中国汽车后市场年度发展报告
- 感染性腹泻的护理查房
- 天津市部分区2023-2024学年高二上学期期末考试 物理 含解析
- 2025年初级社会工作者综合能力全国考试题库(含答案)
- 《人工智能基础》全套英语教学课件(共7章)
- GB/T 35613-2024绿色产品评价纸和纸制品
- 2022-2023学年五年级数学春季开学摸底考(四)苏教版
- 授信审批部工作计划及思路
- 财务管理学(第10版)课件 第3章 财务分析
- 小学语文大单元教学设计与实施
评论
0/150
提交评论