C语言共用体与枚举

上传人:飞*** 文档编号:54715590 上传时间:2018-09-18 格式:PPT 页数:31 大小:170KB
返回 下载 相关 举报
C语言共用体与枚举_第1页
第1页 / 共31页
C语言共用体与枚举_第2页
第2页 / 共31页
C语言共用体与枚举_第3页
第3页 / 共31页
C语言共用体与枚举_第4页
第4页 / 共31页
C语言共用体与枚举_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《C语言共用体与枚举》由会员分享,可在线阅读,更多相关《C语言共用体与枚举(31页珍藏版)》请在金锄头文库上搜索。

1、2018/9/18,C语言程序设计教程,1,12.1 共用体类型与共用体变量 12.2 共用体变量的引用 12.3 共用体变量的应用 12.4 位运算与位段结构 12.5 枚举类型 12.6 类型定义,第十二章 共用体与枚举类型,2018/9/18,C语言程序设计教程,2,12.1 共用体类型与共用体变量,共用体是由用户定义的数据类型。有时需要使几种不同类别的变量存放到同一段内存单元中,也就是使用覆盖技术,几个变量互相覆盖。这种使几个不同的变量共同占用一段内存单元的结构,称为“共用体”类型的结构。1. 共用体类型定义的一般形式 共用体类型定义用关键字union标识, 形式为: union 标识

2、符 成员说明列表 ;,2018/9/18,C语言程序设计教程,3,标识符给出共用体名, 是共用体类型名的主体, 定义的共用体类型由“union 标识符”标识。,2.共用体变量的定义,(1) 先定义共用体类型, 再定义共用体变量: ,union 共用体名 成员表 ; union 共用体名 变量表; ,union data int i;char ch;float f; ; union data a,b,c;,2018/9/18,C语言程序设计教程,4,(2) 定义共用体类型的同时定义共用体变量,union 共用体名 成员表 变量表; ,union data int i;char ch;float

3、f; a,b,c;,(3)定义共用体类型时,省略共用体类型名,同时定义共用体类型变量 union 成员表 变量表;,union int i;char ch;float f; a,b,c;,2018/9/18,C语言程序设计教程,5,注意区分:“共用体”变量:各成员占相同的起始地址,在内存中所占字节数度等于最长的成员在内存中所占的字节数。 “结构体”变量:各成员占不同的地址,在内存中所占字节数等于全部成员在内存中所占的字节数之和。,union int i;char ch;float f; b;,struct int i;char ch;float f; a;,2018/9/18,C语言程序设计教

4、程,6,12.2 共用体变量的引用,共用体变量不能直接使用,和结构体变量一样只能使用里面的某个成员,其成员同样通过点运算描述。形式为: 共用体变量名.成员名,union int i;char ch;float f; a;,例如:左边定义的共用体类型变量a ,a占有4个字节的空间,a.i 表示其整型成员,a.ch表示其字符型成员,a.f表示其单精度型成员。,2018/9/18,C语言程序设计教程,7,说明: (1) 共用体变量中,可以包含若干个成员及若干种类型,但共用体成员不能同时使用。在每一时刻,只有一个成员及一种类型起作用,不能同时引用多个成员及多种类型。 (2) 共用体变量中起作用的成员值

5、是最后一次存放的成员值,因为共用体变量所有成员共同占用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。如: 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的值。,2018/9/18,C语言程序设计教程,8,(3) 共用体变量的地址和它的各个成员的地址相同。(4) 不能企图引用共用体变量名来得到某成员的值。(5) 共用体变量不能作函数参数,函数的返回值也不能是共用体类型。 (6) 共用体类型和结构体类型可以相互嵌

6、套,共用体中成员可以为数组,甚至还可以定义共用体数组。,2018/9/18,C语言程序设计教程,9,例12.1 写出下列程序的执行结果,main() union exxint a,b;structint 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,2018/9/18,C语言程序设计教程,10,12.3 共用体变量的应用 例12.2 设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,

7、若职称为教授,则描述他们所写论文数目。,union cf char clname10; /*所讲课程*/ int num; /*论文数目*/ ; struct teachers int no; /*编号*/char name12; /*姓名*/char zc; /*职称*/union cf x; /*可变字段, 为所讲课程或论文数目*/ teach3;,2018/9/18,C语言程序设计教程,11,#define format %d %s %c main( ) int i; for(i=0; i3; i+)scanf(format,if ( teachi.zc= =L)scanf(”%s”,

8、teachi.x .clname); else if (teachi.zc= =P)scanf (”%d”, &teachi.x .num);else printf (”input data errorn”); ,2018/9/18,C语言程序设计教程,12,for(i=0; i3; i+)printf ( %d %s %c , teachi.no,teachi.name,teachi.zc); if (teachi.zc= =L)printf (”%sn”, teachi.x.clname); else if ( teachi. zc= = P )printf (“%dn“, teachi.

9、x. num); else printf(data errorn); ,2018/9/18,C语言程序设计教程,13,12.4 位运算与位段结构,为了节省内存空间,在系统软件中常将多个标志状态简单地组合在一起,存储到一个字节(或字)中。语言是为研制系统软件而设计的,所以它提供了实现将标志状态从标志字节中分离出来的位运算功能。所谓位运算是指,按二进制位进行的运算。在用位运算符进行数的运算时,数是以补码的形式参加运算的。,12.4.1 位运算及其运算符,2018/9/18,C语言程序设计教程,14,1按位与& (1)格式:x&y (2)规则:对应位均为1时才为1,否则为0: 例如,3&9=1: 0

10、011& 1001 0001=1 (3)主要用途:取(或保留)1个数的某(些)位,其余各位置0。 2按位或| (1)格式:x|y (2)规则:对应位均为0时才为0,否则为1:,2018/9/18,C语言程序设计教程,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),其余各位不变。,2018/9/18,C语言程序设计教程,16,4按位取反 (1)格式:x (2

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

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

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

14、类型。 1. 位段的概念与定义 所谓位段类型,是一种特殊的结构类型,其所有成员均以二进制位为单位定义长度,并称成员为位段。 位段结构中位段的定义格式为:unsigned : 例如,CPU的状态寄存器,按位段类型定义如下:,2018/9/18,C语言程序设计教程,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个字节),比使用结构类型(需要6个字节)节省了5个字节。,2018/9/18,C语言程序设计教程,23,2.说明 (1)因为位段类型是一种结构类型,所以位段类型和位段变量的定义,以及对位段(即位段类型中的成员)的引用,均与结构类型和结构变量一样。(2)对位段赋值时,要注意取置范围。一般地说,长度为n的位段,其取值范围是:0(2n-1)。 (3)可以用%d、%x、%u和%o等格式字符,以整数形式输出位段。 (4)在数值表达式中引用位段时,系统自动将位段转换为整型数。,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号