已阅读5页,还剩33页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章用户定制数据类型,本章介绍一些较为特殊的数据类型,包括共用体类型、枚举类型、位段等。这些数据类型在一般情况下很少用到,但在某些特定的场合,如果能灵活、恰当地使用它们,会有利于提高程序的可读性和可移植性。,10.1共用体类型10.2枚举类型10.3自定义类型名10.4位段与位运算,本章内容,【学习目标】,了解共用体的概念、共用体变量的定义和使用了解枚举类型了解自定义类型名了解位段和位运算,10.1共用体类型,10.1.1共用体类型的定义在C语言诞生的早期,计算机的内存是非常宝贵的,为了节省内存空间,设计了共用体类型。共用体与结构体相似,都属于构造数据类型,但共用体允许不同类型的数据项共占同一块内存空间,彼此相互覆盖。,共用体类型的定义格式如下:struct共用体名类型说明符成员名1;类型说明符成员名2;类型说明符成员名n;例如:uniondatainti;charc;doubled;,10.1.2共用体变量的定义和引用,例如,可以用上面的共用体类型uniondata来定义变量或指针变量:uniondatax,y,*p;定义共用体变量x和y后,系统会为他们分配存储空间,并且是按照共用体中最大成员所占用的字节数来分配的。,2.共用体变量的引用共用体变量的引用方法和结构体变量相同,有如下三种形式:共用体变量名.成员名共用体指针变量名-成员名(*共用体指针变量名).成员名例如,对于前面已经定义的共用体变量x,可以采用下面的方式来输出其成员i的值:printf(%d,x.i);p=,【例10-1】写出下面程序的运行结果。#includeuniondatachara;intb;x;voidmain()x.a=p;printf(%cn,x.a);printf(%dn,x.b);x.b=114;printf(%cn,x.a);,共用体和结构体的定义和引用都很相似,但是两者的含义不同,主要区别如下:(1)共用体变量的所有成员占用相同的存储空间,任何时刻只有一个有意义的成员存在,但结构体变量的每个成员分别占用不同的存储空间,可以同时存在。(2)因为共用体变量在任何时刻只有一个有意义的成员存在,因此,不能像初始化结构体变量那样对它进行初始化。例如,下面的语句是错误的:unioninti;charch;floatf;a=1,p,12.3;,10.2枚举类型,在程序设计过程中,常常遇到这样的情况:有一些变量的值只能取几个有名字的常量。例如,星期只能取Sun、Mon、Tue、Wed、Thu、Fri、Sat,月份只能取January、February、December等。在这种情况下,可以将这些变量定义为枚举类型。,10.2.1枚举类型的定义,和结构体类型一样,使用时要先定义枚举类型,然后再用它来定义枚举变量。枚举类型的定义格式如下:enum枚举名枚举元素列表;例如:enumweekSun,Mon,Tue,Wed,Thu,Fri,Sat;,10.2.2枚举变量的定义和引用,1.枚举变量的定义定义枚举变量的格式如下:enum枚举名变量列表;例如:enumweekworkday,holiday;2.枚举变量的引用定义了枚举变量后,就可以引用它。例如:workday=Mon;holiday=Sat;这两个变量的值只能取列举出的7个元素Sun,Mon,Tue,Wed,Thu,Fri,Sat之一。,【例10-3】从键盘输入数字1到7,输出其对应的英文星期名称。#includevoidmain()enumweekmonday=1,tuesday,wednesday,thursday,friday,saturday,sunday;enumweekday;inti;printf(请输入数字1到7:);scanf(%d,10.3自定义类型名,C语言不仅提供了非常丰富的数据类型,而且允许用户使用typedef定义已有类型的别名,别名与标准类型名一样,可用来定义变量。typedef定义的一般格式如下:typedef原类型名新类型名;下面介绍给数据类型起别名的几种情况:,1.基本数据类型重命名例如:typedefintINTEGER;给整型int定义了一个别名INTEGER,这样在程序中就可以用新类型名来定义变量。例如:INTEGERi,j;/定义整型变量i,j该语句等价于inti,j;数据类型重命名后,原有类型名仍然可以使用。因此,用typedef语句并没有创建新的数据类型,只是给已有数据类型起了一个别名。,2.结构体类型重命名例如:structstu_typecharnum15;/学号charname10;/姓名intage;/年龄;typedefstructstu_typeSTUDENT;STUDENTstu1,stu2;采用STUDENT定义变量时,程序的可读性更好。,3.枚举类型重命名例如:enumflagYES,NO;typedefenumflagFLAG;FLAGx,y;上述语句先定义了枚举类型enumflag,接着将它重命名为FLAG,最后用新的数据类型名定义两个枚举变量x和y。,4.数组类型重命名例如:typedefcharNAME20;NAMEs1,s2;上述语句用typedef定义了一个长度为20的字符数组类型NAME,以后在程序中就可以直接使用NAME来定义数组。如:NAMEs1,s2;等价于chars120,s220;,5.指针类型重命名例如:typedefint*POINTER;POINTERp1,p2;上述语句先用typedef定义了一个指向整型变量的指针类型POINTER,然后用它定义了两个指针变量p1和p2。POINTERp1,p2;等价于int*p1,*p2;,10.4位段与位运算,10.4.1位段以前介绍过的数据类型(如int、float、char等),其长度都是基于字节的,为字节的整数倍,但在许多实际应用中需要按位进行访问。例如,在编写计算机控制程序时,大部分控制信息往往只需用一个或几个二进制位表示即可,可能将某一位设置成1表示启动设备运行,设置成0表示停止设备运行。如果仍然以字节为单位来存储这些信息,将不便于处理,也会造成存储空间的浪费。,1.位段的定义位段是指变量所占用的以位为单位的一块区域,位段不能单独定义,必须存在于结构体中。位段定义的一般格式如下:struct结构体名类型位段名1:长度1;类型位段名2:长度2;类型位段名n:长度n;,【例10-4】写出下面程序的运行结果。#includevoidmain()structbsunsigneda:1;unsignedb:3;unsignedc:4;bit;bit.a=1;bit.b=7;bit.c=15;printf(%d,%d,%dn,bit.a,bit.b,bit.c);,10.4.2位运算,C语言可以按二进制位进行运算,它只适用于整型或字符型数据,运算符有如下六种:/17的二进制数为00000000000000000000000000010001,3.位异或运算符位异或运算符“”是双目运算符,它的功能是:将参加运算的两个数对应的二进制位进行异或运算。异或运算的规则是:只有当对应的两个二进制位不同时,运算结果中该位才是1,否则,该位是0。即相同为0,不同为1。例如:求1321,异或运算可以用来使操作数的某些位翻转(方法是将该位和1进行异或运算)或者保留某些位(方法是将该位和0进行异或运算)。例如,如果需要将整型变量a的第1位和第5位取反,其余位不变,则可以作如下运算:a=a17;/17的二进制数为00000000000000000000000000010001,【例10-4】写出下面程序的运行结果。程序代码如下:#includevoidmain()inta=5,b=3,c,d,e;c=a程序运行结果如下:c=1,d=7,e=6,4.位反运算符位反运算符“”是单目运算符,它的功能是:将操作数按位取反,即0变成1,1变成0。例如:求13,5.位左移运算符位左移运算符“”是双目运算符,它的使用格式如下:操作数位数功能是:将一个操作数按指定的位数左移。左移时,从左边移出的高位部分被丢弃,右边空出的低位部分补0。,【例10-5】写出下面程序的运行结果。程序代码如下:#includevoidmain()inta=3,b,c,d;b=a1;c=a2;d=a”是双目运算符,使用格式如下:操作数位数功能是:将一个操作数按指定的位数右移。右移时,从右边移出的低位部分被丢弃,左边空出的高位部分补0还是补1,按下面的规则处理:(1)若操作数是无符号的,右移时,高位补0。(2)若操作数是有符号的,右移时,包括VC6.0在内的多数编译系统,在高位补符号位,即正数补0,负数补1。,【例10-7】写出下面程序的运行结果。程序代码如下:#includevoidmain()inta=9,b,c,d;b=a1;c=a2;d=a3;printf(a=%d,b=%d,c=%d,d=%dn,a,b,c,d);程序运行结果如下:a=9,b=4,c=2,d=1由此可知,右移一位,相当于该数除以2,7.位赋值运算符除位反运算符外,其它5个位运算符都可以与赋值运算符相结合,形成如下位赋值运算符:,本章小结,1.共用体允许不同类型的数据项共占同一块内存空间,在任一时刻,共用体只能有效地存放一个成员的值,可用来存储那些使用上互斥的变量,以节
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 房屋装修押金协议书
- 房屋赠与夫妻协议书
- 房屋购买租赁协议书
- 房屋通气协议书范本
- 手术术前免责协议书
- 手机怎样编辑协议书
- 打井委托施工协议书
- 打印舞蹈老师协议书
- 打磨合同协议书范本
- 托管厨房外包协议书
- 无人机通信频谱管理政策
- 【地理 湖北卷】2025年湖北省高考招生统一考试真题地理试卷(真题+答案)
- 2025中考数学典型真题分析与巧解方法
- ECMO循环支持精细化护理:多学科协作与质量持续改进实践
- 胖东来运营经理培训课件
- 口腔科正畸科护士进修汇报
- 2025女士内衣行业营销趋势洞察-集瓜数据-202506
- 【ZD6电动转辙机工作原理及故障分析8400字(论文)】
- 2025年数智供应链案例集-商务部
- 新部编人教版三年级上册语文阅读理解全集
- 缆索吊装拆除方案(3篇)
评论
0/150
提交评论