
共同体与枚举类型课件.ppt
25页10.1 共用体类型与共用体变量共用体类型与共用体变量10.2 共用体变量的引用共用体变量的引用10.3 共用体变量的应用共用体变量的应用10.4 位运算与位段结构位运算与位段结构10.5 枚举类型枚举类型10.6 类型定义类型定义第十章第十章 共同体与枚举类型共同体与枚举类型C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页10.1 10.1 共用体类型与共用体变量共用体类型与共用体变量 在某些特殊应用中,有时需要将几种不同类型的变量存放到在某些特殊应用中,有时需要将几种不同类型的变量存放到同一段内存单元中同一段内存单元中, ,即多个数据值覆盖存储,但在任意时刻只能存即多个数据值覆盖存储,但在任意时刻只能存储其中的一种数据,而不能同时存放多种数据储其中的一种数据,而不能同时存放多种数据这种使几个不同这种使几个不同的变量共同占用一段内存单元的结构,称为的变量共同占用一段内存单元的结构,称为““共用体共用体””类型的结类型的结构构共用体也是由用户定义的数据类型共用体也是由用户定义的数据类型。
1. 共用体类型的定义共用体类型的定义共用体类型定义用关键字共用体类型定义用关键字union标识,一般形式为:标识,一般形式为: union 标识符标识符 { 成员说明列表成员说明列表};; C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 例如,定义一个共用体类型例如,定义一个共用体类型union data ,, 包含一个整型成员,包含一个整型成员,一个字符型成员和一个单精度实型成员:一个字符型成员和一个单精度实型成员: union data{ int i; char ch; float f;} ;;注意区分:注意区分: “共用体共用体”类型:类型:各成员占各成员占相同的相同的起始地址,在内存中起始地址,在内存中所占字节数等于所占字节数等于最长的最长的成员在内存中所占的成员在内存中所占的字节数字节数 “结构体结构体”类型:类型:各成员占各成员占不同的不同的地址,在内存中所占地址,在内存中所占字节数等于全部成员在内存中所占的字节数等于全部成员在内存中所占的字节数之和字节数之和。
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; char ch; float f;}a,b,c;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页10.2 10.2 共用体变量的引用共用体变量的引用 共共用用体体变变量量不不能能直直接接使使用用,,只只能能使使用用里里面面的的某某个个成成员员,,其成员同样通过其成员同样通过点运算点运算描述形式为:描述形式为: 共用体变量名共用体变量名. .成员名成员名 union dataunion data{ int i;{ int i; char ch; char ch; float f; float f;}a;}a; 例如:左边定义的共用体类型的例如:左边定义的共用体类型的变量变量a,,a占有占有4个字节的内存空间,个字节的内存空间,a.i 表示其整型成员,表示其整型成员,a.ch表示其表示其字符型成员,字符型成员,a.f表示其单精度型表示其单精度型成员。
但在同一时刻只有一个成成员但在同一时刻只有一个成员有效 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 说明:说明: (1) 共共用用体体变变量量中中,,可可以以包包含含若若干干个个成成员员及及若若干干种种类类型型,,但但共共用用体体成成员员不不能能同同时时使使用用在在每每一一时时刻刻,,只只有有一一个个成成员员起起作用,不能同时引用多个成员作用,不能同时引用多个成员 (2) 共共用用体体变变量量中中起起作作用用的的成成员员值值是是最最后后一一次次存存放放的的成成员员值值,,因因为为共共用用体体变变量量所所有有成成员员共共同同占占用用同同一一段段内内存存单单元元,,后后来来存存放放的的值值将将原原先先存存放放的的值值覆覆盖盖,,故故只只能能使使用用最最后后一一次次给给定定的成员值如:若有语句序列的成员值如:若有语句序列 a.i=27;; a.ch=’D’;; a.f=5.78;不能企图通过下面的不能企图通过下面的printf函数得到函数得到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,,%d\n″,e.x.c,e.x.d);} 程序运行结果如下:程序运行结果如下:60,,3600union data { int a,b; struct { int c;; int d; }x; }e={10};C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页10.3 共用体变量的应用共用体变量的应用union task{ char cname[10];; /*所讲课程所讲课程*/ int num;; /*论文数目论文数目*/};; 例如:设有若干教师的数据,包含有教师编号、姓名、职例如:设有若干教师的数据,包含有教师编号、姓名、职称,若职称为讲师,则描述他们的所讲课程,若职称为教称,若职称为讲师,则描述他们的所讲课程,若职称为教授,则描述他们所写论文数目。
授,则描述他们所写论文数目struct teachers{ int no;; /*编号编号*/ char name[12];; /*姓名姓名*/ char zc;; /*职称职称*/ union task x;; /*可变字段,可变字段, 为所讲课程或论文数目为所讲课程或论文数目*/} teach[3];;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页#define format “%d %s %c ”main(( )){ int i;; for(i=0; i<3; i++)) {scanf (format,,&teach[i].no,teach[i].name, &teach[i].zc);; if ( teach[i].zc= =‘L’)) scanf((”%s”,, teach[i].x .cname);; else if (teach[i].zc= =‘P’)) scanf (”%d”,, &teach[i].x .num);; else { printf (”input data error\n”);; exit(0);} } for(i=0; i<3; i++) { printf (format,,teach[i].no,teach[i].name,teach[i].zc);; if (teach[i].zc= =‘L’)) printf (”%s\n”,, teach[i]ame);); else if ( teach[i]. zc= =‘ P’ )) printf ("%d\n", teach[i].x. num); else printf(″data error\n″);; }} C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页10.4 位运算位运算•数的补码表示数的补码表示–用补码表示数时,正数的补码是它本身。
负数的补用补码表示数时,正数的补码是它本身负数的补码是最高位(用来表示符号,码是最高位(用来表示符号,0表示正数,表示正数,1表示负表示负数,称为符号位)为数,称为符号位)为1,其余各位(数值位)先按,其余各位(数值位)先按位取反(即位取反(即0变为变为1,,1变为变为0),再在),再在最低位最低位加加1–由补码求真值(即实际二进制数)时,若符号位为由补码求真值(即实际二进制数)时,若符号位为0,则补码就是真值若符号为,则补码就是真值若符号为1,则真值为负数,,则真值为负数,真值的数值位为补码的数值位各位按位取反后再在真值的数值位为补码的数值位各位按位取反后再在最低位加最低位加1(若进位位超出数值位的位数,则丢弃)(若进位位超出数值位的位数,则丢弃)C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页a << 2左移<
如果其单元空间不够,则剩余空不能跨两个单元如果其单元空间不够,则剩余空间不用,从下一个单元起存放该位段间不用,从下一个单元起存放该位段–可以通过定义长度为可以通过定义长度为0的位段的方式使下一位段从的位段的方式使下一位段从下一存储单元开始下一存储单元开始 – 可以定义无名位段可以定义无名位段 –位段的长度不能大于存储单元的长度位段的长度不能大于存储单元的长度 –位段无地址,不能对位段进行取地址运算位段无地址,不能对位段进行取地址运算– 位段可以以位段可以以%d,,%o,,%x格式输出格式输出 –位段若出现在表达式中,将被系统自动转换成整数位段若出现在表达式中,将被系统自动转换成整数•应用举例应用举例 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页#include ″stdio.h″void main(){int x,,y; printf(″\n请输入十六进制整数请输入十六进制整数:″);; scanf(″%x″,,&x); y=x>>(16-4)&0xf; x=(x<<4)&0xffff; /*16位的位的C语言程序不需要语言程序不需要″按位与按位与″0xffff*/ x=x|y; printf(″循环左移循环左移4个二进制位得个二进制位得::%x″,,x);} 程序运行结果如下:程序运行结果如下:请输入请输入16进制整数:进制整数:2fe1循环左移循环左移4个二进制位得:个二进制位得:fe12 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页10.5 枚举类型枚举类型 如果一个如果一个变量量只有只有几种可能的几种可能的值,可以将其定,可以将其定义为枚枚举类型。
型枚枚举”即将即将变量可能的量可能的值一一列一一列举出来变量的量的值只能只能取列取列举出来的出来的值之一1.枚举类型的定义枚举类型的定义2. 枚举类型定义用关键字枚举类型定义用关键字 enum 标识,形式为:标识,形式为: enum 枚举名枚举名 { 标识符标识符1 1,标识符,标识符2 ,……} ;; 枚举元素(枚举元素(在定义枚举类型时花括号中的名字称为枚在定义枚举类型时花括号中的名字称为枚举元素或枚举常量,枚举常量是举元素或枚举常量,枚举常量是非一般意义上的常量,而非一般意义上的常量,而只是一个符号),只是一个符号),标识符代表什么含义,完全由程序员决标识符代表什么含义,完全由程序员决定定各枚举元素的顺序决定了它们的值,从各枚举元素的顺序决定了它们的值,从0开始,依次开始,依次递增递增1 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 例如,定义枚举类型例如,定义枚举类型color,包含红、黄、蓝、白、黑,包含红、黄、蓝、白、黑五种颜色:五种颜色: enum color {red, yellow, blue, white, black};; 枚举类型枚举类型enum color有有red、、 yellow、、 blue、、 white、、 black五个枚举元素,五个枚举元素, 系统自动分别为它们赋值为系统自动分别为它们赋值为0、、 1、、 2、、 3、、 4,, 代表红、代表红、 黄、黄、 蓝、蓝、 白、白、 黑五种颜色。
黑五种颜色 在定义枚举类型时,在定义枚举类型时,可在通过可在通过“=”号自己规定枚举元号自己规定枚举元素的起始值素的起始值,并影响后面的枚举元素的值,后继元素的值以,并影响后面的枚举元素的值,后继元素的值以第一个枚举元素的值依次递增第一个枚举元素的值依次递增1 例如例如:enum statu{copy=6,, delete};; 则则copy的值为的值为6,, delete的值为的值为7,可通过,可通过printf函数输出函数输出 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页2. 枚举类型变量的定义枚举类型变量的定义 (1) 先定义枚举类型,先定义枚举类型, 再定义枚举类型变量:再定义枚举类型变量: enum 标识符标识符 {枚举数据表枚举数据表};; enum 标识符标识符 变量表;变量表; 例如,例如, 对枚举类型对枚举类型enum color,, 定义枚举变量定义枚举变量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)枚枚举元素是常量元素是常量,不是变量。
不是变量在C中按定在C中按定义的的顺序取序取值0、、1、、... 例例::printf("%d",yellow); 输出整数出整数1 (2)枚举类型变量可以进行赋值运算例:枚举类型变量可以进行赋值运算例:c1 = yellow; printf("%d", c1);输出整数输出整数1 (3)枚举类型是有序类型,因此枚举类型数据还可以进行枚举类型是有序类型,因此枚举类型数据还可以进行关系运算枚举类型数据的比较转化成对序号进行比较,关系运算枚举类型数据的比较转化成对序号进行比较, 只有同一种枚举类型的数据才能进行比较只有同一种枚举类型的数据才能进行比较 如:如:if(c1==c2) printf(“\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 colorname{red,,yellow,,blue,,white,,black}; enum colorname color; for(color=red;color 如:如: (1)typedef int integer;/*简单的名字替的名字替换*/ 指定用指定用integer代替代替int类型,型,这样,, integer j, k; 等价于等价于 int j, k;(2)typedef int arr[5];/*定定义数数组类型型*/ 指定用指定用arr代替一个包含代替一个包含5个整数的整型数组,这样,个整数的整型数组,这样, arr a,,b; 等价于等价于 int a[5], b[5]; 10.6 类型定义类型定义C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页(3) 定义指针类型定义指针类型 typedef char *STRING; STRING p1,p2,p[10]; 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,*q; (4)typedef struct node { long num; char name[10]; struct node *next; }node,*link;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页归纳起来,声明一个新的起来,声明一个新的类型名的方法是型名的方法是①①先按定先按定义变量的方法写出定量的方法写出定义体体(如如:int j;)。 ②②将将变量名量名换成新成新类型名型名(如:将如:将j换成成integer)③③在最前面加在最前面加typedef(如:如:typedef int integer;)④④然后可以用新然后可以用新类型名去定型名去定义变量 再以定再以定义上述的数上述的数组类型型为例来例来说明:明: ①①先按定先按定义数数组变量形式量形式书写:写:int a[10]; ②②将将变量名量名a换成自己指定的成自己指定的类型名:型名:int arr[10]; ③③在前面加上在前面加上typedef,得到,得到typedef int arr[10]; ④④用来定用来定义变量:量:arr a;;C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页 关于关于typedef的的说明:明: ①①用用typedef可以声明各种可以声明各种类型名,但不能用来定型名,但不能用来定义变量 ②②用用typedef只只是是对已已经存存在在的的类型型增增加加一一个个类型型名名,,而而没没有有创造新的造新的类型 ③③typedef与与#define有相似之有相似之处,如:,如: typedef int integer; #define integer int 两者的作用都是用两者的作用都是用integer 代表代表int。 C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计C C语言程序设计语言程序设计上一页上一页下一页下一页再见!再见!同学们:同学们:。
