




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、10.1 共用体类型与共用体变量共用体类型与共用体变量10.2 共用体变量的引用共用体变量的引用10.3 共用体变量的应用共用体变量的应用10.4 位运算与位段结构位运算与位段结构10.5 枚举类型枚举类型10.6 类型定义类型定义第十章第十章 共同体与枚举类型共同体与枚举类型c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页10.1 10.1 共用体类型与共用体变量共用体类型与共用体变量 在某些特殊应用中,有时需要将几种不同类型的变量存放到在某些特殊应用中,有时需要将几种不同类型的变量存放到同一段内
2、存单元中同一段内存单元中, ,即多个数据值覆盖存储,但在任意时刻只能存即多个数据值覆盖存储,但在任意时刻只能存储其中的一种数据,而不能同时存放多种数据。储其中的一种数据,而不能同时存放多种数据。这种使几个不同这种使几个不同的变量共同占用一段内存单元的结构,称为的变量共同占用一段内存单元的结构,称为“共用体共用体”类型的结类型的结构构。共用体也是由用户定义的数据类型。共用体也是由用户定义的数据类型。1. 共用体类型的定义共用体类型的定义共用体类型定义用关键字共用体类型定义用关键字union标识,标识,一般形式一般形式为:为: union 标识符标识符 成员说明列表成员说明列表; c c语言程序设
3、计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页 例如,定义一个共用体类型例如,定义一个共用体类型union data , 包含一个整型成员包含一个整型成员,一个字符型成员和一个单精度实型成员:,一个字符型成员和一个单精度实型成员: union dataint i;char ch;float f; ;注意区分:注意区分: “共用体共用体”类型:类型:各成员占各成员占相同的相同的起始地址,在内存中起始地址,在内存中所占字节数等于所占字节数等于最长的最长的成员在内存中所占的成员在内存中所占的字节数字节数。 “结构体结构
4、体”类型:类型:各成员占各成员占不同的不同的地址,在内存中所占地址,在内存中所占字节数等于全部成员在内存中所占的字节数等于全部成员在内存中所占的字节数之和字节数之和。c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页2. 共用体变量的定义,三种形式:共用体变量的定义,三种形式: 例如:例如:union data int i; char ch; float f;union data a,b,c;union data int i; char ch; float f;a,b,c;union int i; c
5、har ch; float f;a,b,c;c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页10.2 10.2 共用体变量的引用共用体变量的引用 共用体变量不能直接使用,只能使用里面的某个成员,共用体变量不能直接使用,只能使用里面的某个成员,其成员同样通过其成员同样通过点运算点运算描述。形式为:描述。形式为: 共用体变量名共用体变量名. .成员名成员名 union dataunion data int int i; i; char ch char ch; ; float f; float f;a;a
6、; 例如:左边定义的共用体类型的例如:左边定义的共用体类型的变量变量a,a占有占有4个字节的内存空间,个字节的内存空间,a.i 表示其整型成员,表示其整型成员,a.ch表示其表示其字符型成员,字符型成员,a.f表示其单精度型表示其单精度型成员。但在同一时刻只有一个成成员。但在同一时刻只有一个成员有效。员有效。 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页 说明:说明: (1) 共用体变量中,可以包含若干个成员及若干种类型,共用体变量中,可以包含若干个成员及若干种类型,但但共用体成员不能同时使用共
7、用体成员不能同时使用。在每一时刻,只有一个成员起。在每一时刻,只有一个成员起作用,不能同时引用多个成员。作用,不能同时引用多个成员。 (2) 共用体变量中起作用的成员值是最后一次存放的成员共用体变量中起作用的成员值是最后一次存放的成员值值,因为共用体变量所有成员共同占用同一段内存单元,后,因为共用体变量所有成员共同占用同一段内存单元,后来存放的值将原先存放的值覆盖,故只能使用最后一次给定来存放的值将原先存放的值覆盖,故只能使用最后一次给定的成员值。如:若有语句序列的成员值。如:若有语句序列 a.i=27; a.ch=d; a.f=5.78;不能企图通过下面的不能企图通过下面的printf函数得
8、到函数得到a.i和和a.ch的值:的值: printf(“%d,%c,%f”, a.i, a.ch, a.f);只能得到只能得到a.f的值。的值。c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页共用体变量的引用举例共用体变量的引用举例 main()e.b=e.a+20;e.x.c=e.a+e.b;e.x.d=e.a*e.b;printf(%d,%dn,e.x.c,e.x.d); 程序运行结果如下:程序运行结果如下:6060,36003600union data int a,b; struct int
9、 c; int d; x; e=10;c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页10.3 共用体变量的应用共用体变量的应用union task char cname10; /*所讲课程所讲课程*/ int num; /*论文数目论文数目*/; 例如:设有若干教师的数据,包含有教师编号、姓名、职例如:设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职称为教称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。授,则描述他们所写论文数目
10、。struct teachers int no; /*编号编号*/ char name12; /*姓名姓名*/ char zc; /*职称职称*/ union task x; /*可变字段,可变字段, 为所讲课程或论文数目为所讲课程或论文数目*/ teach3;c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页#define format “%d %s %c ”main( ) int i; for(i=0; i3; i+) scanf (format,&teachi.no,, &
11、teachi.zc); if ( teachi.zc= =l) scanf(”%s”, teachi.x .cname); else if (teachi.zc= =p) scanf (”%d”, &teachi.x .num); else printf (”input data errorn”); exit(0); for(i=0; i3; i+) printf (format,teachi.no,,teachi.zc); if (teachi.zc= =l) printf (”%sn”, ame);); else if ( teachi. zc= = p ) prin
12、tf (%dn, teachi.x. num); else printf(data errorn); c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页10.4 位运算位运算 数的补码表示数的补码表示 用补码表示数时,正数的补码是它本身。负数的用补码表示数时,正数的补码是它本身。负数的补码是最高位(用来表示符号,补码是最高位(用来表示符号,0表示正数,表示正数,1表表示负数,称为符号位)为示负数,称为符号位)为1,其余各位(数值位),其余各位(数值位)先按位取反(即先按位取反(即0变为变为1,1变为变
13、为0),再在),再在最低位最低位加加1。 由补码求真值(即实际二进制数)时,若符号位由补码求真值(即实际二进制数)时,若符号位为为0,则补码就是真值。若符号为,则补码就是真值。若符号为1,则真值为负,则真值为负数,真值的数值位为补码的数值位各位按位取反数,真值的数值位为补码的数值位各位按位取反后再在最低位加后再在最低位加1(若进位位超出数值位的位数,(若进位位超出数值位的位数,则丢弃)。则丢弃)。c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页a 2左移 3右移flag & 0 x37按位与&(关系
14、运算符)(低)flag | 0 x5a按位或|(高)flag按位取反(算术运算符)举例(赋值运算符)优先级名称位运算符c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页位段结构位段结构 位段结构中位段的定义格式为: unsigned 成员名:二进制位数 struct bytedata unsigned a:2;/*位段a,占两位*/ unsigned:6; /*无名位段,占6位,但不能访问*/ unsigned:0; /*无名位段,占0位,表示下一位段 从下一字边界开始*/ unsigned b:10
15、; /*位段b,占10位*/ int i; /*成员i,从下一字边界开始*/data; data变量的内存分配示意图 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页位段结构注意事项位段结构注意事项 一个位段必须存储在同一存储单元(即字)之中,一个位段必须存储在同一存储单元(即字)之中,不能跨两个单元。如果其单元空间不够,则剩余空不能跨两个单元。如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段。间不用,从下一个单元起存放该位段。 可以通过定义长度为可以通过定义长度为0的位段的方式使下一位
16、段从的位段的方式使下一位段从下一存储单元开始。下一存储单元开始。 可以定义无名位段。可以定义无名位段。 位段的长度不能大于存储单元的长度。位段的长度不能大于存储单元的长度。 位段无地址,不能对位段进行取地址运算。位段无地址,不能对位段进行取地址运算。 位段可以以位段可以以%d,%o,%x格式输出。格式输出。 位段若出现在表达式中,将被系统自动转换成整数。位段若出现在表达式中,将被系统自动转换成整数。 应用举例应用举例 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页#include stdio.hv
17、oid main()int x,y; printf(n请输入十六进制整数请输入十六进制整数:); scanf(%x,&x); y=x(16-4)&0 xf; x=(x4)&0 xffff; /*16位的位的c语言程序不需要语言程序不需要按位与按位与0 xffff*/ x=x|y; printf(循环左移循环左移4个二进制位得个二进制位得:%x,x); 程序运行结果如下:程序运行结果如下:请输入请输入1616进制整数:进制整数:2fe12fe1循环左移循环左移4 4个二进制位得:个二进制位得:fe12fe12 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序
18、设计c c语言程序设计语言程序设计上一页上一页下一页下一页10.5 枚举类型枚举类型 如果一个变量如果一个变量只有只有几种可能的值,可以将其定义为枚举类几种可能的值,可以将其定义为枚举类型。型。“枚举枚举”即将变量可能的值一一列举出来。变量的值只能即将变量可能的值一一列举出来。变量的值只能取列举出来的值之一。取列举出来的值之一。1. 枚举类型的定义枚举类型的定义 枚举类型定义用关键字枚举类型定义用关键字 enum 标识,形式为:标识,形式为: enum 枚举名枚举名 标识符标识符1 1,标识符,标识符2 , ; 枚举元素(枚举元素(在定义枚举类型时花括号中的名字称为枚在定义枚举类型时花括号中的
19、名字称为枚举元素或枚举常量,枚举常量是举元素或枚举常量,枚举常量是非一般意义上的常量,而非一般意义上的常量,而只是一个符号),只是一个符号),标识符代表什么含义,完全由程序员决标识符代表什么含义,完全由程序员决定定。各枚举元素的顺序决定了它们的值,从各枚举元素的顺序决定了它们的值,从0开始,依次开始,依次递增递增1。 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页 例如,定义枚举类型例如,定义枚举类型color,包含红、黄、蓝、白、黑,包含红、黄、蓝、白、黑五种颜色:五种颜色: enum colo
20、r red, yellow, blue, white, black; 枚举类型枚举类型enum color有有red、 yellow、 blue、 white、 black五个枚举元素,五个枚举元素, 系统自动分别为它们赋值为系统自动分别为它们赋值为0、 1、 2、 3、 4, 代表红、代表红、 黄、黄、 蓝、蓝、 白、白、 黑五种颜色。黑五种颜色。 在定义枚举类型时,在定义枚举类型时,可在通过可在通过“=”号自己规定枚举元素号自己规定枚举元素的起始值的起始值,并影响后面的枚举元素的值,后继元素的值以第,并影响后面的枚举元素的值,后继元素的值以第一个枚举元素的值依次递增一个枚举元素的值依次递增
21、1。 例如例如:enum statucopy=6, delete; 则则copy的值为的值为6, delete的值为的值为7,可通过,可通过printf函数输出。函数输出。 c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页2. 枚举类型变量的定义枚举类型变量的定义 (1) 先定义枚举类型,先定义枚举类型, 再定义枚举类型变量:再定义枚举类型变量: enum 标识符标识符 枚举数据表枚举数据表; enum 标识符标识符 变量表;变量表; 例如,例如, 对枚举类型对枚举类型enum color, 定义枚
22、举变量定义枚举变量c1、 c2: enum color red, yellow, blue, white, black; enum color c1, c2;(2) 在定义枚举类型的同时定义枚举类型变量:在定义枚举类型的同时定义枚举类型变量: enum 标识符标识符 枚举数据表枚举数据表 变量表;变量表; enum color red,yellow,blue,white,black c1, c2;c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页说明:说明: (1)枚举元素是常量枚举元素是常量,不是变
23、量不是变量。在中按定义的顺序取值在中按定义的顺序取值0、1、. 例例:printf(%d,yellow); 输出整数输出整数1。 (2)枚举类型变量可以进行赋值运算。例:枚举类型变量可以进行赋值运算。例:c1 = yellow; printf(%d, c1);输出整数输出整数1。 (3)枚举类型是有序类型,因此枚举类型数据还可以进行枚举类型是有序类型,因此枚举类型数据还可以进行关系运算。枚举类型数据的比较转化成对序号进行比较,关系运算。枚举类型数据的比较转化成对序号进行比较, 只有同一种枚举类型的数据才能进行比较。只有同一种枚举类型的数据才能进行比较。 如:如:if(c1=c2) printf
24、(“n%s”,”the color is same”); if(c1=red) printf(“n%s”,”red”); (3) 直接定义枚举类型变量:直接定义枚举类型变量: enum 枚举数据表枚举数据表 变量表;变量表; enum red, yellow, blue, white, black c1, c2; c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页void main() enum colornamered,yellow,blue,white,black; enum colorname
25、color; for(color=red;colorblack;color+) switch(color) case red:printf(red);break; case yellow:printf(yellow);break; case blue:printf(blue);break; case white:printf(white);break; case black:printf(black);break; c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页 除了可以直接使用除了可以直接使用c
26、 c提供的标准类型名(如提供的标准类型名(如int,char,float) )和自己声明的结构体、共用体、指针、枚举类型外,还可以和自己声明的结构体、共用体、指针、枚举类型外,还可以用用typedef声明声明新的类型名来代替已有的类型名新的类型名来代替已有的类型名。如:。如: (1)typedef int integer;/*简单的名字替换简单的名字替换*/ 指定用指定用integer代替代替int类型,这样,类型,这样, integer j, k; 等价于等价于 int j, k;(2)typedef int arr5;/*定义数组类型定义数组类型*/ 指定用指定用arr代替一个包含代替一个
27、包含5个整数的整型数组,这样,个整数的整型数组,这样, arr a,b; 等价于等价于 int a5, b5; 10.6 类型定义类型定义c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页(3) 定义指针类型定义指针类型 typedef char *string; string p1,p2,p10; p1 p2 为字符型指针变量,为字符型指针变量,p为字符型指针数组为字符型指针数组c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计c c语言程序设计语言程序设计上一页上一页下一页下一页 指定用指定用node代替上述结构体类型代替上述结构体类型struct node ,用用link代替结构体指针类型,这样代替结构体指针类型,这样 node stu1,stu2; 等价于等价于 struct node stu1,stu2; link p,q; 等价于等价于 struct node *p,*q; 或或 node *p,*
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 自贡闲置水库管理办法
- 航空企业用户管理办法
- 药品管理办法直播回放
- 药审沟通交流管理办法
- 菏泽装饰装修管理办法
- 襄阳校园疫情管理办法
- 西城校园门禁管理办法
- 西安医院节能管理办法
- 西安隧道安全管理办法
- 证券产品承销管理办法
- 智慧型陆基式渔业产业园项目可行性研究报告模板-备案拿地
- 基本药物培训课件资料
- 吉林省长春市2024-2025学年八年级下学期期末测试数学试卷(含答案)
- 2025秋三年级上册语文上课课件 9 犟龟
- 电子文件长期保存技术-洞察及研究
- 广告安装培训课件
- 石灰厂中控室管理制度
- 《党政机关厉行节约反对浪费条例》培训课件
- 太阳能安装工程管理制度
- 中外航海文化知到课后答案智慧树章节测试答案2025年春中国人民解放军海军大连舰艇学院
- 人工智能引论智慧树知到课后章节答案2023年下浙江大学
评论
0/150
提交评论