C语言共用体与枚举.ppt

上传人:牧羊曲112 文档编号:6503785 上传时间:2023-11-07 格式:PPT 页数:31 大小:228.49KB
返回 下载 相关 举报
C语言共用体与枚举.ppt_第1页
第1页 / 共31页
C语言共用体与枚举.ppt_第2页
第2页 / 共31页
C语言共用体与枚举.ppt_第3页
第3页 / 共31页
C语言共用体与枚举.ppt_第4页
第4页 / 共31页
C语言共用体与枚举.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C语言共用体与枚举.ppt》由会员分享,可在线阅读,更多相关《C语言共用体与枚举.ppt(31页珍藏版)》请在三一办公上搜索。

1、2023/11/7,1,12.1 共用体类型与共用体变量12.2 共用体变量的引用12.3 共用体变量的应用12.4 位运算与位段结构12.5 枚举类型12.6 类型定义,第十二章 共用体与枚举类型,2023/11/7,2,12.1 共用体类型与共用体变量,共用体是由用户定义的数据类型。有时需要使几种不同类别的变量存放到同一段内存单元中,也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共同占用一段内存单元的结构,称为“共用体”类型的结构。1.共用体类型定义的一般形式共用体类型定义用关键字union标识,形式为:union 标识符 成员说明列表;,2023/11/7,3,标识符给出共用

2、体名,是共用体类型名的主体,定义的共用体类型由“union 标识符”标识。,2.共用体变量的定义,(1)先定义共用体类型,再定义共用体变量:,union 共用体名 成员表;union 共用体名 变量表;,union data int i;char ch;float f;union data a,b,c;,2023/11/7,4,(2)定义共用体类型的同时定义共用体变量,union 共用体名 成员表 变量表;,union data int i;char ch;float f;a,b,c;,(3)定义共用体类型时,省略共用体类型名,同时定义共用体类型变量union 成员表 变量表;,union i

3、nt i;char ch;float f;a,b,c;,2023/11/7,5,注意区分:“共用体”变量:各成员占相同的起始地址,在内存中所占字节数度等于最长的成员在内存中所占的字节数。“结构体”变量:各成员占不同的地址,在内存中所占字节数等于全部成员在内存中所占的字节数之和。,union int i;char ch;float f;b;,struct int i;char ch;float f;a;,2023/11/7,6,12.2 共用体变量的引用,共用体变量不能直接使用,和结构体变量一样只能使用里面的某个成员,其成员同样通过点运算描述。形式为:共用体变量名.成员名,union int i

4、;char ch;float f;a;,例如:左边定义的共用体类型变量a,a占有4个字节的空间,a.i 表示其整型成员,a.ch表示其字符型成员,a.f表示其单精度型成员。,2023/11/7,7,说明:(1)共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用。在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型。(2)共用体变量中起作用的成员值是最后一次存放的成员值,因为共用体变量所有成员共同占用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。如:a.i=278,a.ch=D,a.f=5.78;不能企图通过下面的prin

5、tf函数得到a.i和a.ch的值:printf(“%d,%c,%f”,a.i,a.ch,a.f);但能得到a.f的值。,2023/11/7,8,(3)共用体变量的地址和它的各个成员的地址相同。(4)不能企图引用共用体变量名来得到某成员的值。(5)共用体变量不能作函数参数,函数的返回值也不能是共用体类型。(6)共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组。,2023/11/7,9,例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+

6、e.b;e.lpp.d=e.a*e.b;printf(“%d,%dn”,e.lpp.c,e.lpp.d);,程序运行结果如下:60,3600,2023/11/7,10,12.3 共用体变量的应用 例12.2 设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。,union cfchar clname10;/*所讲课程*/int num;/*论文数目*/;struct teachers int no;/*编号*/char name12;/*姓名*/char zc;/*职称*/union cf x;/*可变字段,为所讲课程或论文

7、数目*/teach3;,2023/11/7,11,#define format%d%s%c main()int i;for(i=0;i3;i+)scanf(format,if(teachi.zc=L)scanf(”%s”,teachi.x.clname);else if(teachi.zc=P)scanf(”%d”,&teachi.x.num);else printf(”input data errorn”);,2023/11/7,12,for(i=0;i3;i+)printf(%d%s%c,teachi.no,teachi.name,teachi.zc);if(teachi.zc=L)pri

8、ntf(”%sn”,teachi.x.clname);else if(teachi.zc=P)printf(%dn,teachi.x.num);else printf(data errorn);,2023/11/7,13,12.4 位运算与位段结构,为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。语言是为研制系统软件而设计的,所以它提供了实现将标志状态从标志字节中分离出来的位运算功能。所谓位运算是指,按二进制位进行的运算。在用位运算符进行数的运算时,数是以补码的形式参加运算的。,12.4.1 位运算及其运算符,2023/11/7,14,1按位与&(1)

9、格式:x&y(2)规则:对应位均为1时才为1,否则为0:例如,3&9=1:0011&1001 0001=1(3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。2按位或|(1)格式:x|y(2)规则:对应位均为0时才为0,否则为1:,2023/11/7,15,例如,3|9=11:0011|1001 1011=11(3)主要用途:将1个数的某(些)位置1,其余各位不变。3按位异或(1)格式:xy(2)规则:对应位相同时为0,不同时为1:39=10。(3)主要用途:使1个数的某(些)位翻转(即原来为1的位变为0,为0的变为1),其余各位不变。,2023/11/7,16,4按位取反(1)格式

10、:x(2)规则:各位翻转,即原来为1的位变成0,原来为0的位变成1:例如,直接构造一个全1的数,在IBM-PC机中为0 xffff(2字节),而在VAX-11/780上,却是0 xffffffff(4字节)。如果用0来构造,系统可以自动适应。5按位左移(1)格式:x 位数(2)规则:使操作数的各位左移,低位补0,高位溢出:52=20。,2023/11/7,17,6按位右移(1)格式:x位数(2)规则:使操作数的各位右移,移出的低位舍弃;高位:1)对无符号数和有符号中的正数,补0;2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”。例如,20 2=5。,20

11、23/11/7,18,说明:(1)x、y和“位数”等操作数,都只能是整型或字符型数据。除按位取反为单目运算符外,其余均为双目运算符。(2)参与运算时,操作数x和y,都必须首先转换成二进制形式,然后再执行相应的按位运算。例如,5 2=5:10100 00101。,2023/11/7,19,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;prin

12、tf(Input a integer number:);scanf(%d,2023/11/7,20,说明:,(1)复合赋值位运算符 除按位取反运算外,其余5个位运算符均可与赋值运算符一起,构成复合赋值位运算符:&=、|=、=、=(2)不同长度数据间的位运算低字节对齐,短数的 高字节按最高位补齐:对无符号数和有符号中的正数,补0;有符号数中的负数,补1。,2023/11/7,21,12.4.3 位段结构 有时,存储1个信息不必占用1个字节,只需二进制的1个或多个位就够用。如果仍然使用结构类型,则造成内存空间的浪费。为此,C语言引入了位段类型。1.位段的概念与定义 所谓位段类型,是一种特殊的结构类

13、型,其所有成员均以二进制位为单位定义长度,并称成员为位段。位段结构中位段的定义格式为:unsigned:例如,CPU的状态寄存器,按位段类型定义如下:,2023/11/7,22,struct status unsigned sign:1;/*符号标志*/unsigned zero:1;/*零标志*/unsigned carry:1;/*进位标志*/unsigned parity:1;/*奇偶/溢出标志*/unsigned half_carry:1;/*半进位标志*/unsigned negative:1;/*减标志*/flags;显然,对CPU的状态寄存器而言,使用位段类型(仅需1个字节),比

14、使用结构类型(需要6个字节)节省了5个字节。,2023/11/7,23,2.说明(1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0(2n-1)。(3)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。(4)在数值表达式中引用位段时,系统自动将位段转换为整型数。,2023/11/7,24,12.5 枚举类型,如果一个变量只有几种可能的值,可以定义为枚举类型。“枚举”:将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。枚

15、举类型的定义 枚举类型定义用关键字enum标识,形式为:enum 枚举名标识符=整常数,枚举变量名;枚举元素(非一般意义上的常量,也不是变量,而只是一个符号),只能是标识符,而不能是字符常量或符号常量,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。,2023/11/7,25,(1)定义枚举类型status,包含复制与删除两种状态:enum statuscopy,delete;枚举类型status仅有两个数据,一个是copy,一个是delete,序号为0、1,代表复制与删除。(2)定义枚举类型color,包含红、黄、蓝、白、黑五种颜色:enum c

16、olor red,yellow,blue,white,black;枚举类型color有red、yellow、blue、white、black五个数据,序号为0、1、2、3、4,代表红、黄、蓝、白、黑五种颜色。在定义枚举类型时,程序员可在枚举数据时通过“=”号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增。例如:enum statucopy=6,delete;则copy的序号为6,delete的序号为7。,2023/11/7,26,2.枚举类型变量的定义,(1)先定义枚举类型,再定义枚举类型变量:enum 标识符 枚举数据表;enum 标识符 变量表;例如:enum color re

17、d,yellow,blue,white,black;enum color c1,c2;(2)在定义枚举类型的同时定义枚举类型变量:enum 标识符 枚举数据表 变量表;例如:enum color red,yellow,blue,white,black c1,c2;,2023/11/7,27,(3)直接定义枚举类型变量:enum 枚举数据表 变量表;enum red,yellow,blue,white,black c1,c2;说明:(1)枚举元素是常量,不是变量。在中按定义的顺序取值0、1、.例:c1=yellow;printf(%d,c1);输出整数1。(2)枚举类型变量可以进行赋值运算。枚举

18、类型是有序类型,枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较,只有同一种枚举类型的数据才能进行比较。如:if(c1=c2)printf(“n%s”,”The color is same”);if(c1=red)printf(“n%s”,”red”);,2023/11/7,28,12.6 类型定义 除了可以直接使用C提供的标准类型名(如int,char,float)和自己声明的结构体、共用体、指针、枚举类型外,还可以用typedef声明新的类型名来代替已有的类型名。如:(1)typedef int integer;指定用integer代替int类型,这样integer

19、j,k;等价于 int j,k;(2)typedef int arr5;指定用arr代替一个包含5个整数的整型数组,这样arr a,b;等价于int a5,b5;,2023/11/7,29,(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;,2023/11/7,30,归纳

20、起来,声明一个新的类型名的方法是先按定义变量的方法写出定义体(如:int j;)。将变量名换成新类型名(如:将j换成integer)。在最前面加typedef(如:typedef int integer;)。然后可以用新类型名去定义变量。再以定义上述的数组类型为例来说明:先按定义数组变量形式书写:int a10;将变量名a换成自己指定的类型名:int arr10;在前面加上typedef,得到typedef int arr10;用来定义变量:arr a;,2023/11/7,31,关于typedef的说明:用typedef可以声明各种类型名,但不能用来定义变量。用typedef只是对已经存在的类型增加一个类型名,而没有创造新的类型。typedef与#define有相似之处,如:typedef int integer;#define integer int;两者的作用都是用integer 代表int。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号