c语言基础教程_第九章联合和枚举,版

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

免费版第九章联合和枚举9.1.1联合变量的定义和赋值联合变量定义的形式与结构很相似,除关键字不同,其余几乎相同。下面是一个联合模式的定义格式:union(联合名){(联合成员说明);};其中,union是联合的关键字。(联合名)的命名方法同标识符,联合成员说明》是将组成该联合的所有成员进行类型说明。C:语言中,几乎所有类型都作为联合的成员,包含结构变量在内。联合变量的定义如下所示:union联合名)(联合变量名表);定义一个联合变量之前要先定义一种联合模式,任何一种联合变量都是属于某种联合模式的联合变量,这一点与结构变量很相似。联合变量名表)中,可以是一个联合变量名,也可是多个联合变量名,多个变量用逗号分隔。这里的变量可以是一般联合变量,也可以是指向联合变量的指针。例如:uniondate{Charc_data;intidata;floatf._data;doubled_data;};uniondatadl,d2.*pd.其中,anion是关键字,data是联合名,该联合有4个成员,分别作了说明dl和d2是两个联合变量,pd是一个指向联合变量的指针。联合变量dl和d2都是具有联合名data的联合变量。而联合变量指针pd也是指向具有data联合名的联合变量的指针。与结构相类似,上述定义联合变量也可以写成如下形式:uniondata{charc_data;inti_data;floatf_data;doubled_data;}d1,d2,*pd;这里,也同样定义了联合变量dl和d2以及指向联合变量的指针pd。联合变量的成员表示也与结构相似。联合变量的成员用·表示,指向联合变量的指针用一表示。联合变量的赋值主要是给联合变量的各成员赋值。例如,在上例中,对联合变量dl的几个成员赋值分别如下:dl.c_data='a';dl.i_data=15;dl.f_data=10.5;dl.b_data=87.63;对指向联合变量的指针pd赋值与给联合变量赋值相同,只是其成员表示不同。例如,给pd的最后一个成员赋值如下:Pd一d_data=97.0由于联合变量中的若干个成员共用内存单元,即一个联合变量的所有成员具有一个相同的内存地址值,因此,在联合变量中起作用的成员是最近一次被赋值的成员,因为一个联合变量的若干个成员共用一个内存地址,存入了新的成员值时,原来的成员值便失去意义。如果给联合变量赋初值,只能有一个值,并且指定斌给第一个成员,而不能用多个值赋给多个成员,其原因是由于联合变量所有成员共占一个内存地址。C语言基础教程9.1.2联合与结构的区别前面对联合变量的定义和联合变量成员的表示以及对联合变量的赋值作了描述,可以看出联合与结构有许多相似之处,但是也指出了两者的最大区别在于联合是共址的,结构是异址的。即联合的所有成员共同使用一个内存地址,而结构的每个成员都有自己的内存地址。由于联合的共址特性使得它与结构产生了很大差别。例如,在斌初值时,联合变量只能给第一个成员赋初值;不能对联合变量名赋值;不能用联合变量作函数参数,也不能用联合变量作函数的返回值,只能用指向联合变量的指针作函数参数。下面举出两个例子说明联合变量的使用和特点。[例9.1]分析下列程序的输出结果,进而说明联合变量的成员是共址的。uninndata{charc_data;inti_data;floatf_data;};main(){uniandatadl;d1.c_data='a';dl.i_data=5;d1.f_data=3.7;printf(%c\t%d\t%.2f\n,dl.c._data,dl.i_data,dl.f,data);printf(%d\n',sizeof(dl));printf(%p\t%p\t%p\t%p\n,&dl.c_data,&dl.i_data,&dl.f.data,&dl);}执行该程序输出结果如下:??3.7(?表示无意义)4FFD6FFD6FFD6FFD6说明:(1)该程序中,首先定义一个联合,其名为data,它有3个成员,分别是三种不同类型。又定义联合变量d3,并给它的三个成员分别赋值。当使用printf()函数输出dl的三个成员的值时,前两个成员输出值是无意义的,只有最后一个成员是有意义的,其值为3.7.这说明:某一时刻一个联合变量中只有一个成员起作用,其他成员不起作用。(2)输出,SizeoE(dl)的值为4,这说明联合变量d1占内存4个字节。在多个联合成员共占一个内存地址时,该地址所指向的内存空间是所有成员中占内存空间最大的成员所占的内存空间。该例中的三个成员所占内存字节数分别为1.2和4,最大的是4,因此,联合变量dl所占内存空间为4个字节。(3)使用printf()函数分别输出联合变量dl的三个成员的内存地址都是相同的,并且与联合变量dl的地址值也是相同的,可见联合变量各成员是共址的。[例9.2]分析下列程序的输出结果,并指出该结果说明了什么间题。main(){union{intig[6],chars[12];}try;try.ig[0]=0x4542;try.ig[1]=0x2049;try.ig[2]=Ox494a;try.igt3]=0x474e;try.ig[4]=Ox0a21;try.ig[5]=0x0000:prints(%s\n,try.s),执行该程序输出如下结果:BEIJING说明:该程序中定义一个无名联合,用它定义一个联合变量try,该联合有2个成员,每个成员都占内存12个字节。程序中对try的ig成员斌了值,ig是一个int型数组,分别对它的6个元素都赋了值。然后,程序中通过try的另一个成员。进行输出,所输出的字符串正是try的成员所被赋值的ASCII码所对应的字符组成的。由此可见,联合变量各个成员是共内存单元的,因此。按某个成员赋的值,可按其另一个成员进行输出,但要求输出的类型与效据类型相一致。C语言基础教程9.2联合的应用由联合的特征决定了它的应用远不如结构应用那样广泛。但是。在有些情况下也使用联合来解决问题。在实际应用中,常常会出现一些虽相互间排斥的情况,这时用联合就十分方便。例如,假定某学校一些学生在校内住宿,另一些学生在校外住宿。对于在校内和在校外住宿的学生的住址描述是不同的,可分别用下述两种结构来描述:structoff__school{intstrnucmcharstrnamet[20];charcity(20];}structinschool{charcollname[lO];chardorm[l0];introomnum;};住在校外的学生可用off_school结构来描述地址,而住在校内的学生可用in.school结构来描述地址。而对每个学生来说,情况是唯一的,即二舌只可选择其一。于是,一个学生的地址可用下述联合来描述:unionaddress{structoff_schooltown;structinschoolgown;};该联合中两个成员是结构变量,即结构变量可以作联合成员.相反,联合变量也可以作为结构成员,即联合与结构二者可以相互嵌套。例如:structstudent{charname[20};intstunum;intgrade[3];unionaddressa;}:该结构中,有一个成员a是联合变量,而该联合中又有结构变量。这便是结构和联合的定义上的嵌套。虽然,由于联合成员是共址的,而对联合变童应用作了一些限制,不像结构变量应用得那么广泛、但是联合变量除了可以作为结构成员外。还可以作为数组元素,即联合数组。另外,指向联合变量的指针可以作函数参数等。[例9.3]假定描述一个学生使用下面的内容:学号,姓名,三门功课的成绩和住址。其中,住址有两种情况:住在校内和住在校外。使用一个变量来标识一个学生住在校内或是校外,而学生住址用前面讲过的联合address来表示。于是描述学生的结构格式如下:structstudent{intstunum;charname[20]intgrade[3]charoffin;unionaddressa;};其中,char型变量off_in用来标识该学生是住在校内(用n表示)还是住在校外(用'f'表示).编程输人每个学生的信息,并通过姓名来查找某个学生的住址和三门成绩总和。程序内容如下:structoffschool{intstrnum;chars1rname[20];charcity[20];};strurtinschool{charcollname[10]:chardorm[l0];introomnum;};unionadclress{structoff.schooltown;structin_schoolgown;};strsscrstudentrintstunumcharname[20];intgrade[3];charoffin;unionaddressa;}s[3]={{7001,Li,{90,80,85},'f'}{7002,Ma,{85.95,87},'f'},{7003,Lu,{80,75,83},'n'}};main(){inti;charname[20];for(i=0;i3;i++){printf(Inputaddress--);if(s[i].off_in=='f'){printf(strnum,strname,city:);scanf(%d%s%s,&s[i].a.town.strnum.s[i].a.town.strname,s[i].a.town.city);}else{printf(collname,dowm.roomnum:);scanf(%s%s%d,s[i].a.gown,collname.s[i].a.gown.dorm,&s[i].a.gown.roomnum);}}printf(Inputname:);scanf(%s,name)for(i=0;i3;i||){if(Istrcmps[i].name.name))if(s[i].off_in=='f'){printf(%d,%s,%s\n,s[i].a.town.strnum,s[i].a.town.strname.s[i].a.town.city);printf(%d\n,s[i].grade[0]+s[i].grade[1]+s[i],grade[2]);}else{printf(%s,%s,%d\n,s[i].a.gown.collname,s[i].a,gown.dorms[i].a.gown.rommnum);printf(%d\n,s[i],grade[0]+s[i].grade[1].grade[2];}}}执行该程序,屏幕上显示如下信息:Inputaddress-strnum,strname,city:101HaidianBeijingInputaddress-strnum,strname,city:203HaidianBeijingInputaddress-collnum,dorm,rommnum:Beida35d105Inputname:Ma这时,屏幕上显示该程序的输出结果:203,Haidian,Beijing267说明:该程序是结构和联合相互嵌套,结构中有联合变量,联合中又有结构变量。程序中定义的s是结构数组,它有三个元素。开始时对每个元素的前4个成员赋了初值,然后在程序中又通过键盘输入给S的3个元素中最后一个成员赋值,由〕几该成员的值有两种形式,或者是校外地址形式,或者是校内地址形式,因此使用了下列if语句:if(s[i].off_in='f')满足该if条件,则按校外地址格式输入地址,否则按校内地址格式输入地址。同样,在输出学生地址时,也有两种不同形式。C语言基础教程9.3.1枚举变量的定义和赋值枚举也是一种构造的数据类型,具有这种类型的变量,称为枚举变量。枚举变量的定义形式与结构变量、联合变量有相似之处,但是枚举变量与它们都有很大的不同。枚举是具有名字的若干个常量的有序集合,枚举变量的取值范围是该枚举表

1 / 12
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功