您好,欢迎访问三七文档
第22讲共用体与枚举•教学目的与要求:掌握共用体的声明、定义和使用方法了解枚举类型及用typedef定义类型•教学内容提要:1、共用体2、枚举类型3、用typedef定义类型•教学重点:共用体的声明、定义和使用方法•教学难点:共用体的声明、定义和使用方法•教学进度:P269~272•教学过程:构造数据类型,也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)1、共用体类型定义定义形式:union共用体名{类型标识符成员名;类型标识符成员名;…………….};例uniondata{inti;charch;floatf;};fchi类型定义不分配内存一、共用体形式一:uniondata{inti;charch;floatf;}a,b;形式二:uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];形式三:union{inti;charch;floatf;}a,b,c;fchifchiab共用体变量定义分配内存,长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在2、共用体变量的定义引用方式:例a.i=1;a.ch=‘a’;a.f=1.5;printf(“%d”,a.i);(编译通过,运行结果不对)引用规则不能引用共用体变量,只能引用其成员共用体指针名-成员名共用体变量名.成员名(*共用体指针名).成员名uniondata{inti;charch;floatf;};uniondataa,b,c,*p,d[3];a.ia.cha.fp-ip-chp-f(*p).i(*p).ch(*p).fd[0].id[0].chd[0].f共用体变量中起作用的成员是最后一次存放的成员例union{inti;charch;floatf;}a;a=1;()不能在定义共用体变量时初始化例union{inti;charch;floatf;}a={1,’a’,1.5};()可以用一个共用体变量为另一个变量赋值例floatx;union{inti;charch;floatf;}a,b;a.i=1;a.ch=‘a’;a.f=1.5;b=a;()x=a.f;()3、共用体变量引用0110000101000001低字节高字节0100000101100001ch[0]ch[1]运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=amain(){unionint_char{inti;charch[2];}x;x.i=24897;printf(i=%o\n,x.i);printf(ch0=%o,ch1=%o\nch0=%c,ch1=%c\n,x.ch[0],x.ch[1],x.ch[0],x.ch[1]);}例将一个整数按字节输出例写出下列程序的执行结果main(){unionexx{inta;intb;struct{intc,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,%d\n”,e.lpp.c,e.lpp.d);}程序运行结果如下:60,3600区别:存储方式不同structnode{charch[2];intk;}a;unionnode{charch[2];intk;}b;achkbchk变量的各成员同时存在任一时刻只有一个成员存在联系:两者可相互嵌套4、结构体与共用体二、枚举类型1.枚举类型的定义枚举类型定义用关键字enum标识,形式为:enum{枚举数据表};标识符用来区分不同的枚举类型,定义的枚举类型用enum标识符标识。枚举数据(枚举常量)是一些特定的标识符,标识符代表什么含义,完全由程序员决定。数据枚举的顺序规定了枚举数据的序号,从0开始,依次递增。例如:(1)定义枚举类型status,包含复制与删除两种状态:enumstatus{copy,delete};枚举类型status仅有两个数据,一个是copy,一个是delete,序号为0、1,代表复制与删除。(2)定义枚举类型color,包含红、黄、蓝、白、黑五种颜色:enumcolor{red,yellow,blue,white,black};枚举类型color有red、yellow、blue、white、black五个数据,序号为0、1、2、3、4,代表红、黄、蓝、白、黑五种颜色。(3)定义枚举类型weekday,包含一周的七天:enumweekday{sun,mon,tue,wed,thu,fri,sat};枚举类型weekday有sun、mon、tue、wed、thu、fri、sat七个数据,序号为0、1、2、3、4、5、6,代表一周中的星期天、星期一、星期二、星期三、星期四、星期五、星期六。在定义枚举类型时,程序员可在枚举数据时通过“=”号自己规定序号,并影响后面的枚举数据的序号,后继序号以此递增。例如:enumstatus{copy=6,delete};则copy的序号为6,delete的序号为7。2.枚举类型变量的定义(1)先定义枚举类型,再定义枚举类型变量:enum标识符{枚举数据表};enum标识符变量表;(2)在定义枚举类型的同时定义枚举类型变量:enum标识符{枚举数据表}变量表;(3)直接定义枚举类型变量:enum{枚举数据表}变量表;枚举变量的值只限于列举出来的值的范围内。例:enumweekday{sun,mon,tue,wed,thu,fri,sat};enumweekdayworkday,week-end;workday和week_end值只能是sun到sat之一。例如:workday=mon;week_end=sun;是正确的。1、在C编译中,对枚举元素按常量处理,故称枚举常量。它们不是变量,不能对它们赋值。例如:sun=0;mon=1;是错误的。(2)枚举元素作为常量,它们是有值的,在上面定义中,sun的值为0,mon的值为1……sat为6。如果有赋值语句:workday=mon;printf(%d,workday);将输出整数1。(3)枚举值可以用来做判断比较。如if(workday==mon)…if(workday>sun)…枚举值的比较规则是按其在定义时的顺序号比较。(4)一个整数不能直接赋给一个枚举变量。如:workday=2;是不对的。它们属于不同的类型。应先进行强制类型转换才能赋值。如:workday=(enumweekday)2;说明:1、功能:用自定义名字为已有数据类型命名2、类型定义简单形式:typedeftypename;例typedefintINTEGER;类型定义语句关键字已有数据类型名用户定义的类型名例typedeffloatREAL;类型定义后,与已有类型一样使用例INTEGERa,b,c;REALf1,f2;inta,b,c;floatf1,f2;说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与define不同definetypedef预编译时处理编译时处理简单字符置换为已有类型命名三、用typedef定义类型3.定义一个类型名代表一个结构体类型例如:typedefstruct{longnum;charname[20];floatscore;}STUDENT;将一个结构体类型struct{…}定义为花括号后的名字STUDENT。可以用它来定义变量。STUDENTstudent1,student2,*p;
本文标题:c语言教案第22讲
链接地址:https://www.777doc.com/doc-3377429 .html