资源预览内容
第1页 / 共83页
第2页 / 共83页
第3页 / 共83页
第4页 / 共83页
第5页 / 共83页
第6页 / 共83页
第7页 / 共83页
第8页 / 共83页
第9页 / 共83页
第10页 / 共83页
亲,该文档总共83页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第9章章结构体等构造数据类型结构体等构造数据类型l9.1 9.1 结构体结构体 l l 9.2 9.2 结构体与数组结构体与数组 l l 9.3 9.3 结构体与指针结构体与指针 l l 9.4 9.4 结构体与函数结构体与函数 l l 9.5 9.5 联合体联合体 l l 9.6 9.6 枚举枚举 l l 9.7 9.7 类型定义类型定义 9.1 9.1 结构体结构体 结结构构体体类类型型的的数数据据由由若若干干称称为为“成成员员”的的数数据据组组成成,每每一一个个成成员员既既可可以以是是一一个个基基本本数数据据类类型型的的数数据据,也也可可以以是是另另一一个个构构造造类型的数据。类型的数据。结结构构体体实实际际上上是是C编编译译没没有有提提供供的的数数据据类类型型,可可以以由由程程序序员员根根据据实实际际情情况况来来自自己己构造的一种新的数据类型。构造的一种新的数据类型。9.1.1结构体的说明结构体的说明为了描述起来简单,我们要先定义一为了描述起来简单,我们要先定义一个结构体类型:个结构体类型:time。time是时间,是时间,10点点30分分50秒就是一个时间数据,当然我们可秒就是一个时间数据,当然我们可以用三个整型变量来表示一个时间,以用三个整型变量来表示一个时间,inthour;intminute;intsecond;不能表示三个变量之间的逻辑关系。不能表示三个变量之间的逻辑关系。我们把时间说明为我们把时间说明为TIME,而而TIME含有小时、分、秒三个成分,则含有小时、分、秒三个成分,则TIME的结的结构体说明是:构体说明是:structTIMEinthour;intminute;intsecond;其中其中struct是关键字,是关键字,TIME是结构体是结构体的类型名,它实际上规定了一种新的复杂数的类型名,它实际上规定了一种新的复杂数据类型。据类型。于是在随后的程序中就可以使用于是在随后的程序中就可以使用TIME定义结构体变量了。定义结构体变量了。structTIMEaudit_begin;结构体的说明方式:结构体的说明方式:struct结构体名结构体名成员表;成员表;其中成员表可以由一个或几个成员组其中成员表可以由一个或几个成员组成,要说明每个成员的类型和名称,注意成,要说明每个成员的类型和名称,注意最后用分号结束。最后用分号结束。结构体变量的定义方式:结构体变量的定义方式:struct结构体名结构体名结构体变量表;结构体变量表;结构体构体说明要注意下面几点:明要注意下面几点:(1)结构体构体说明并不引起存明并不引起存储分配,分配,结构体构体变量的定量的定义才引起存才引起存储分配。存分配。存储分配分配时,通常按照各成通常按照各成员在在结构体构体说明中出明中出现的先的先后后顺序依次排列。序依次排列。结构体成构体成员的数据的数据类型型可以是可以是C语言的基本数据言的基本数据类型,也可以型,也可以是数是数组和指和指针类型。型。(2) 结构构体体成成员还可可以以是是另另一一个个结构构体体类型型,结构体构体说明可以嵌套。明可以嵌套。structOBJECTstructTASKlongplan;longstart;longfinish;ti,tj;intcount;OBJECT中嵌套定中嵌套定义了另外一个了另外一个结构体构体TASK。(3)结构体说明不允许递归,也就是不允结构体说明不允许递归,也就是不允许在一个结构体说明中嵌套对自己的定义。许在一个结构体说明中嵌套对自己的定义。structWRONGstructWRONGa;/*错误错误*/intcount;9.1.2结构体变量的定义结构体变量的定义结构体变量定义有三种方法。结构体变量定义有三种方法。第第一一种种方方法法就就是是上上面面用用过过的的:先先说说明明结结构构体,再定义结构体变量。体,再定义结构体变量。第二种方法是在说明结构体类型的同时定第二种方法是在说明结构体类型的同时定义结构体变量。义结构体变量。例如:例如:structTIMEinthour;intminute;intsecond;audit_begin,audit_end; 这种方法的语法格式是:这种方法的语法格式是:struct结构体名结构体名成员表;成员表;结构体变量表;结构体变量表;第三种方法是在说明结构体时直接定义第三种方法是在说明结构体时直接定义结构体变量,并且不用指定结构体名。结构体变量,并且不用指定结构体名。structinthour;intminute;intsecond;audit_begin,audit_end;这种形式的语法为:这种形式的语法为:struct成员表;成员表;结构体变量表;结构体变量表; 不能混淆结构体名和结构体变量这两不能混淆结构体名和结构体变量这两个概念。个概念。结构体名实际上标识了程序员定结构体名实际上标识了程序员定义的一种新的数据类型,编译系统不可能义的一种新的数据类型,编译系统不可能为结构体名分配内存空间。只有当变量被为结构体名分配内存空间。只有当变量被说明为这种由程序员自己定义的数据类型说明为这种由程序员自己定义的数据类型的结构体时,编译系统才会为结构体变量的结构体时,编译系统才会为结构体变量分配存储空间。在不引起混淆的情况下,分配存储空间。在不引起混淆的情况下,结构体变量可以简称为结构体。结构体变量可以简称为结构体。9.1.3结构体成员的引用结构体成员的引用C语言中对结构体变量的使用是通过语言中对结构体变量的使用是通过对其成员的引用来实现的。一般不能对对其成员的引用来实现的。一般不能对结构体变量进行整体的引用。结构体变量进行整体的引用。引用的方法:引用的方法:结构体变量名结构体变量名.成员名成员名符符号号“.”是是依依据据结结构构体体变变量量名名存存取取结结构体成员的运算符。构体成员的运算符。例例9.1用用符号符号“.”引用引用结构体构体变量的成量的成员。#includestdio.hvoidmain()structTIMEinthour;intminute;intsecond;structTIMEaudit_begin;audit_begin.hour=8;/*为audit_begin的每个成的每个成员赋值*/audit_begin.minute=30;audit_begin.second=00;printf(nauditiontimeis%02d:%02d:%02d,audit_begin.hour,audit_begin.minute,audit_begin.second); 注意,注意,对嵌套结构体的引用必须引用对嵌套结构体的引用必须引用到最末一级。到最末一级。structOBJECTstructTASKlongplan;longstart;longfinish;ti,tj;intcount;ob;可可以以使使用用scanf(“%d”,&ob.ti.plan)输入数据。入数据。但是不能引用但是不能引用ob.ti。9.1.4结构体的初始化结构体的初始化对结构体变量的初始化与对数组的对结构体变量的初始化与对数组的初始化相似,因为存储分配时,通常按照初始化相似,因为存储分配时,通常按照各成员在结构体中出现的先后顺序连续排各成员在结构体中出现的先后顺序连续排列。列。structTIMEaudit_begin=8,30,0;如果初始化数值的个数小于结构体成如果初始化数值的个数小于结构体成员的个数,系统会自动将其它成员初始化员的个数,系统会自动将其它成员初始化为为0。例例9.2结构体构体变量的初始化。量的初始化。#includestdio.hvoidmain()structTIMEinthour;intminute;intsecond;structTIMEaudit_begin=8,30,0;printf(nauditiontimeis%02d:%02d:%02d,audit_begin.hour,audit_begin.minute,audit_begin.second);9.2结构体与数组结构体与数组9.2.1结构体包含数组结构体包含数组由于结构体的成员可以是任何基由于结构体的成员可以是任何基本数据类型和另外一个构造类型,所本数据类型和另外一个构造类型,所以结构体的成员当然可以是数组。以结构体的成员当然可以是数组。下面我们说明一个可以描述一个股票下面我们说明一个可以描述一个股票信息的结构体:信息的结构体:structSTOCKcharstockname8;/*股票名称股票名称*/charstockcode6;/*股票代码股票代码*/floatprice3;/*买买入价、卖出价、成交价入价、卖出价、成交价*/;例例9.3结构体中包含数构体中包含数组。#includestdio.hvoidmain() int i; struct STOCK char stockname16; /*股票名称股票名称 */ char stockcode7; /*股票代码股票代码 */ float price3; /*买入价、卖出价、成交价买入价、卖出价、成交价 */ ; Struct STOCK sfz=ShenFaZhan,000001,8.77,8.78,8.78;/*用深发展的数据初始化结构体变量用深发展的数据初始化结构体变量sfz*/printf(n %s %s , sfz.stockname, sfz.stockcode);/*输出股票名称和股票代出股票名称和股票代码*/for(i=0;i3;i+)/*输出股票的出股票的买入价、入价、卖出价和成交价出价和成交价*/printf(%6.2f,sfz.pricei);9.2.2结构体数组结构体数组一个结构体变量只能存放一个结一个结构体变量只能存放一个结构体数据,假设有构体数据,假设有4个股票(或者更个股票(或者更多)的信息要描述,如何处理呢?多)的信息要描述,如何处理呢? 每一支股票用一个结构体变量来存储,每一支股票用一个结构体变量来存储,四个就要用四个结构体变量来存储,这四四个就要用四个结构体变量来存储,这四个结构体变量的构成是完全一样的。个结构体变量的构成是完全一样的。 很容易想到用结构体数组:很容易想到用结构体数组:structSTOCKstock4;定义结构体数组的语法:定义结构体数组的语法:struct结构体名结构体名数组名数组名长度长度;访问结构体数组中的结构体成员访问结构体数组中的结构体成员的方法是:的方法是:数组名数组名下标下标.成员名成员名例例9.4输入四支股票的信息并入四支股票的信息并输出。出。#includestdio.hvoidmain()inti,j;floattemp;structSTOCKcharstockname16;/*股票名称股票名称*/charstockcode7;/*股票代股票代码*/floatprice3;/*买入价、入价、卖出价、成交价出价、成交价*/;structSTOCKstock4;for(i=0;i4;i+)printf(Pleaseenterstockname,stockcodeand3price:n);scanf(%s%s,stocki.stockname,stocki.stockcode);for(j=0;j3;j+)/*输入股票的入股票的买入价、入价、卖出价出价和成交价和成交价*/scanf(%f,&temp);/*读入价格入价格*/stocki.pricej=temp;for(i=0;i4;i+)printf(n%s%s,stocki.stockname,stocki.stockcode);for(j=0;j”,另一种是使,另一种是使用用运算符运算符“*”。l运算符运算符“-”由由“减号减号”和和“大于号大于号”构构成。用成。用运算符运算符“-”引用指针所指的结构体成员的引用指针所指的结构体成员的方法是:方法是:结构体指针变量名结构体指针变量名-成员名成员名b-hour对应对应begin.hour,b-minute对应对应begin.minuteb-second对应对应begin.second。 l使用使用“*”运算符也可以通过指向结构体变运算符也可以通过指向结构体变量的指针访问结构体成员。用运算符量的指针访问结构体成员。用运算符“*”引引用指针所指的成员的方法是:用指针所指的成员的方法是:(*结构体指针变量名结构体指针变量名).成员名成员名(*b).hour对应对应begin.hour,(*b).minute对应对应begin.minute,(*b).second对应对应begin.second。l注意:必须用圆括号将注意:必须用圆括号将*b括起来,因为括起来,因为按照优先级和结合性,按照优先级和结合性,(*b.hour)将解释为将解释为*(b.hour),这是没有意义的。这是没有意义的。l两种方法中比较常用的是第一种,要注意两种方法中比较常用的是第一种,要注意的是:的是:“-”不是应用于结构体的,而是应不是应用于结构体的,而是应用于指向结构体的指针的。用于指向结构体的指针的。例例9.5使指向结构体变量的指针。使指向结构体变量的指针。#includestdio.hvoidmain()structTIMEinthour;intminute;intsecond;*p;structTIMEaudit_begin=8,30,0;/*初始化初始化audit_begin*/p=&audit_begin;printf(“nauditiontimeis%02d:%02d:%02d”,p-hour,p-minute,(*p).second);例例9.6用用姓姓名名、工工资资和和年年龄龄描描述述一一个个人人的的情情况况,编编写写程程序序输输入入5个个人人的的情情况况,为为每每个个人人增增加加工工资资30%、年年龄龄加加一一岁,输出修改后的结果。岁,输出修改后的结果。#includestdio.h#defineSIZE5voidmain()structstaffcharname20;intsalary;intage;attendSIZE;structstaff*ap;putchar(n);for(ap=attend;apname,&(ap-salary),&(ap-age);for(ap=attend;apage+;/*年龄增加一岁年龄增加一岁*/ap-salary*=(1+.3);/*工资增加工资增加30%*/for(ap=attend;apname),(ap-salary),(ap-age);9.3.2结构体中的成员包含指针结构体中的成员包含指针例例9.7初始化一组股票名称和股票代码,在程序初始化一组股票名称和股票代码,在程序中输出。中输出。#includestdio.hvoidmain()inti;structSTOCK2longstockcode;/*股票代码股票代码*/char*stockname;/*股票名称股票名称*/;staticstructSTOCK2stock4=1,ShenFaZhan,96,GuangJuNengYuan,600868,MeiYanGuFen,66,ChangChengDianNao;for(i=0;inext=q;q-next=NULL;printf(n%20s%06ld,p-stockname,p-stockcode);printf(n%20s%06ld,(p-next)-stockname,(p-next)-stockcode);例例9.11链接两个动态分配的结构体变量。链接两个动态分配的结构体变量。#includestdio.h#includealloc.h#includestring.hvoidmain()structSTOCK2longstockcode;/*股票代码股票代码*/charstockname20;/*股票名称股票名称*/structSTOCK2*next;/*指向一个象自己一样的结构体变量指向一个象自己一样的结构体变量*/*p;p=(structSTOCK2*)malloc(sizeof(structSTOCK2);/*动态分配一个结构体变量,用动态分配一个结构体变量,用p指向它指向它 l if(p=NULL)return;lp-stockcode=1;lstrcpy(p-stockname,ShenFaZhan);lp-next=(structSTOCK2*)malloc(sizeof(structSTOCK2);/*动态分配另一个结构体变量,用动态分配另一个结构体变量,用p-next指向它指向它*/lif(p-next=NULL)return;lp-next-stockcode=96;lstrcpy(p-next-stockname,GuangJuNengYuan);lp-next-next=NULL;l/*第二个结构体变量的第二个结构体变量的next项设置为空指针项设置为空指针*/lprintf(n%20s%06ld,p-stockname,p-stockcode);lprintf(n%20s%06ld,l(p-next)-stockname,(p-next)-stockcode);l9.4结构体与函数结构体与函数9.4.1结构体数据作为函数的参数结构体数据作为函数的参数结构体数据作为函数的参数分为两种情况:结构体数据作为函数的参数分为两种情况:(1)结结构构体体变变量量的的每每个个成成员员作作为为函函数数的的实实际际参数参数(2)指向结构体的指针作为函数的实际参数指向结构体的指针作为函数的实际参数 整个结构体变量一般不允许作为函数整个结构体变量一般不允许作为函数的实际参数(有些编译系统允许)。的实际参数(有些编译系统允许)。例例9.13结构体数据作构体数据作为函数的参数。函数的参数。#includestdio.hvoidshow1(longcode,char*name);voidshow2(structSTOCK2*p,intsize);structSTOCK2/*在函数外部说明结构体在函数外部说明结构体*/longstockcode;charstockname20;voidmain()staticstructSTOCK2stock4=1,ShenFaZhan,96,GuangJuNengYuan,600868,MeiYanGuFen,66,ChangChengDianNao;show1(stock0.stockcode,stock0.stockname);show2(stock,4);voidshow1(longcode,char*name)printf(%20s%06ldn,name,code);voidshow2(structSTOCK2*p,intsize)structSTOCK2*q;for(q=p;qstockname,q-stockcode);9.4.2返回指向结构体的指针的函数返回指向结构体的指针的函数函数能函数能够返回指向返回指向结构体的指构体的指针。若要函数返回指向若要函数返回指向结构体的指构体的指针,函,函数定数定义的首部的首部应定定义为:struct结构体名构体名*函数名函数名(参数表参数表)9.5联合体联合体联合体又称为公用体。联合体又称为公用体。在编制一些比较高级的程序时,有时在编制一些比较高级的程序时,有时需要把不同类型的变量放在同一存储区域需要把不同类型的变量放在同一存储区域内。内。一个变量一个变量x,它既可以用来存储一个它既可以用来存储一个单字符还可以存储一个浮点数或是一个整单字符还可以存储一个浮点数或是一个整数,当然,在一个时间点,它只能存放其数,当然,在一个时间点,它只能存放其中的一种数据,新的数据覆盖老的数据,中的一种数据,新的数据覆盖老的数据,新的数据是什么数据类型,新的数据是什么数据类型,x变量就是什么变量就是什么数据类型。数据类型。要定义这种类型的变量,就必须要定义这种类型的变量,就必须首先说明一个联合体。首先说明一个联合体。9.5.1联合体的说明联合体的说明联合体的说明与结构体的说明很联合体的说明与结构体的说明很相似,其格式为:相似,其格式为:union联合体名联合体名成员表成员表;例如,例如,unionmixedcharc;floatf;inti;mixed为联合体名,与说明结构体一样,为联合体名,与说明结构体一样,说明一个联合体,只是说明了一种新的数说明一个联合体,只是说明了一种新的数据类型,并不引起内存的分配。据类型,并不引起内存的分配。9.5.2联合体变量的定义联合体变量的定义联合体变量的定义方法也有三种,联合体变量的定义方法也有三种,(一一)先说明联合体,再定义联合体变量先说明联合体,再定义联合体变量(二二)在在说说明明联联合合体体类类型型的的同同时时定定义义联联合合体体变变量量(三三)直接定义联合体变量。直接定义联合体变量。这三种方法与结构体变量的定义方法这三种方法与结构体变量的定义方法几乎没有区别。几乎没有区别。unionmixedcharc;floatf;inti;unionmixedx;unioncharc;floatf;inti;x;unionmixedcharc;floatf;intIx;与结构体变量不同的是,联合体与结构体变量不同的是,联合体变量在内存中所占的字节数是成员表变量在内存中所占的字节数是成员表中最大的,而不象结构体变量是所有中最大的,而不象结构体变量是所有成员所占字节数的总和。成员所占字节数的总和。unionmixedx=a;这时,系统按成员这时,系统按成员c对第一个字对第一个字节赋值,其余单元的值为节赋值,其余单元的值为0。9.5.3联合体变量成员的引用联合体变量成员的引用对于联合体变量成员的直接引对于联合体变量成员的直接引用用是是使使用用运运算算符符“.”,语语法法是是:联联合合体变量名体变量名.成员名。成员名。例例如如x.f,可可以以将将x.f看看成成一一个个普普通通的浮点型数据进行存取。的浮点型数据进行存取。注注意意: 不不能能对对联联合合体体变变量量x直直接接存存取取内内容。容。x=15.00是错误的,只能对是错误的,只能对x的三的三个成员进行操作,这三个成员是个成员进行操作,这三个成员是x.f、x.i和和x.c,并且这三个联合体成员不可并且这三个联合体成员不可能同时存在。能同时存在。9.5.3联合体变量成员的引用联合体变量成员的引用对于联合体变量成员的直接引对于联合体变量成员的直接引用用是是使使用用运运算算符符“.”,语语法法是是:联联合合体变量名体变量名.成员名。成员名。例例如如x.f,可可以以将将x.f看看成成一一个个普普通通的浮点型数据进行存取。的浮点型数据进行存取。例如,在下面的程序中,执行语句例如,在下面的程序中,执行语句x.i=10;以后以后x.f的值是不能够确定的。的值是不能够确定的。#includestdio.hunionmixedcharc;floatf;inti;voidmain()unionmixedx;x.i=10;printf(%f,x.f);/*x.f的值不确定的值不确定*/9.5.4指向联合体变量的指针指向联合体变量的指针通过指向联合体变量的指针也通过指向联合体变量的指针也可以对联合体变量进行存取,使用可以对联合体变量进行存取,使用指向联合体变量的指针存取联合体指向联合体变量的指针存取联合体变量成员的语法格式是:变量成员的语法格式是:(*指向联合体变量的指针指向联合体变量的指针).成员名成员名指向联合体变量的指针指向联合体变量的指针-成员名成员名例例9.19使用指针引用联合体的成员。使用指针引用联合体的成员。#includestdio.hunionSTOCK3longstockcode;/*股票代码股票代码*/char*stockname;/*股票名称股票名称*/;voidmain()unionSTOCK3st,*p=&st;st.stockname=ShenFanZhan;printf(nstocknameis%s,p-stockname);/*通过指针引用联合体变量的成员通过指针引用联合体变量的成员*/9.5.5联合体变量与函数联合体变量与函数联联合合体体变变量量的的成成员员值值可可以以作作为为函函数的参数,联合体变量不能作为函数数的参数,联合体变量不能作为函数的参数,并且函数的返回类型也不能的参数,并且函数的返回类型也不能是联合体;但是,指向联合体变量的是联合体;但是,指向联合体变量的指针可以作为函数的参数,返回值也指针可以作为函数的参数,返回值也可以是指向联合体变量的指针。可以是指向联合体变量的指针。9.6枚举枚举 使用枚举变量的主要目的是提高使用枚举变量的主要目的是提高程序的可读性,所谓程序的可读性,所谓“枚举枚举”就是把所就是把所有可能的取值情况列举出来。例如,有可能的取值情况列举出来。例如,真和假表示了逻辑值的两种情况,男真和假表示了逻辑值的两种情况,男和女是性别的两种取值,选修课成绩和女是性别的两种取值,选修课成绩有有“优优”、“良良”、“中中”、“及及格格”和和“不及格不及格”五种取值。五种取值。9.6.1枚举的说明和枚举变量的定义枚举的说明和枚举变量的定义枚举的说明格式为:枚举的说明格式为:enum枚举名枚举名枚举元素表(逗号分隔)枚举元素表(逗号分隔);enumcolorred,green,blue,yellow,white;enumboolfalse,true;枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。枚枚举举变变量量的的定定义义与与结结构构体体相相类类似似,也也有有三三种:种:(1)与枚举说明分开定义与枚举说明分开定义enum枚举名枚举名变量名表;变量名表;例如:例如:enumcolorred,green,blue,yellow,white;enumcolorselect,change;select和和change是枚举变量。是枚举变量。(2)与枚举说明一起定义与枚举说明一起定义例如:例如:enumcolorred,green,blue,yellow,whiteselect,change;(3)不说明枚举名,直接定义枚举变量不说明枚举名,直接定义枚举变量例如:例如:enumred,green,blue,yellow,whiteselect,change;9.6.2枚举变量的使用枚举变量的使用枚举变量的使用与结构体变量枚举变量的使用与结构体变量完全不同。完全不同。如果一个变量被定义为是一个如果一个变量被定义为是一个枚举变量,则它的取值只能取自对枚举变量,则它的取值只能取自对应的枚举元素,而不能是其它任何应的枚举元素,而不能是其它任何数。数。如果有定义如果有定义enumred,green,blue,yellow,whiteselect,change;则则select=red;和和change=white;都是正确的,而都是正确的,而select=red_white是是错误的,因为错误的,因为red_white并没有在并没有在枚举元素表中出现。枚举元素表中出现。枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。C编译对枚举元素作为常整数处编译对枚举元素作为常整数处理,遇到枚举元素时,编译程序把理,遇到枚举元素时,编译程序把其中第一个枚举元素赋值为其中第一个枚举元素赋值为0,第,第2个赋值为个赋值为1,所以,所以select=red;和和change=white;两句赋值语句执行以两句赋值语句执行以后,后,select的值为的值为0,change的值为的值为4。C语言允许程序员将某些枚举元素语言允许程序员将某些枚举元素强制赋值,指定为一整数常量,被强制强制赋值,指定为一整数常量,被强制赋值的枚举元素后面的值按顺序逐个增赋值的枚举元素后面的值按顺序逐个增1。enumcolorred,green,blue=5,yellow,white/*实际值为实际值为0,1,5,6,7*/;枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。使用枚举类型时,不提倡将整型值使用枚举类型时,不提倡将整型值与枚举元素直接联系起来,只要简单地与枚举元素直接联系起来,只要简单地把这些变量看成具有某种特点的枚举类把这些变量看成具有某种特点的枚举类型的变量。型的变量。enumboolfalse,trueflag;if(flag=false)9.7类型定义类型定义使用类型定义的目的是简化结使用类型定义的目的是简化结构体和联合体等构造类型的类型说明,构体和联合体等构造类型的类型说明,同时可以增强可读性。同时可以增强可读性。类型定义的一般格式是:类型定义的一般格式是:typedef原类型名原类型名新类型名;新类型名;功能:将原类型名表示的数据类功能:将原类型名表示的数据类型用新类型名代替。型用新类型名代替。typedefintCOUNTER;现在现在COUNTER是是int的另一个的另一个名字,那么,使用名字,那么,使用COUNTERi,j,k;定义变量定义变量i、j和和k以后,它们实际上以后,它们实际上都是整型数,用都是整型数,用COUNTER定义可定义可以明确地表示这几个变量是做计数以明确地表示这几个变量是做计数器的。器的。typedefcharSTRING81;STRINGtext,input_line;text和和input_line是包含是包含81个字符个字符的数组。的数组。typedefchar*STRING_PTR;STRING_PTRbuffer;buffer为指向字符的指针。为指向字符的指针。typedefstructtimeinthour;intminute;intsecond;TIME;TIME可以直接作为一种新的数据可以直接作为一种新的数据类型说明符,而不必再使用关键字类型说明符,而不必再使用关键字struct了了。TIMEbirth;birth变量的数据类型是变量的数据类型是time结构体类型。结构体类型。typedefintCOUNTER;现在现在COUNTER是是int的另一个的另一个名字,那么,使用名字,那么,使用COUNTERi,j,k;定义变量定义变量i、j和和k以后,它们实际上以后,它们实际上都是整型数,用都是整型数,用COUNTER定义可定义可以明确地表示这几个变量是做计数以明确地表示这几个变量是做计数器的。器的。类型定义的步骤:类型定义的步骤:第一步:第一步:象说明一个普通的变量一样,用希望象说明一个普通的变量一样,用希望新命名的数据类型定义一个变量。新命名的数据类型定义一个变量。例如,例如,inti;第二步:第二步:将第二步定义的变量名用新的类型名将第二步定义的变量名用新的类型名代替。例如,代替。例如,intCOUNTER;第三步:第三步:将第二步定义的句子前加上将第二步定义的句子前加上typedef。例如,例如,typedefintCOUNTER;COUNTER成为一种新的数据类型名。成为一种新的数据类型名。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号