《结构体、枚举和共用体类型.ppt》由会员分享,可在线阅读,更多相关《结构体、枚举和共用体类型.ppt(72页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第8 8章章 结构体、枚举和结构体、枚举和共用体类型共用体类型 10.1 结构体类型结构体类型10.2结构体和函数结构体和函数10.3 动态数据结构动态数据结构链链表表10.4枚举类型枚举类型10.5共用体类型共用体类型10.6 用户自定义类型用户自定义类型10.1 结构体类型n结构体类型的定义n结构体类型中可以根据需要包含若干相同或不同类型的成员,这些成员所代表的信息必须是相关的信息。n结构体类型定义的格式为:struct 结构体名结构体名类型名类型名 成员名成员名1;类型名类型名 成员名成员名2;类型名类型名 成员名成员名n;;例如,struct date int year;int mo
2、nth;int day;10.1 结构体类型struct studentint number;/*学号*/char name8;/*姓名*/char sex;/*性别*/float score4;/*成绩*/;nstruct是结构体类型的标识,是关键字。struct和后面的结构体名共同构成结构体类型名。结构体名应符合标识符的命名规则。n结构体所有成员的定义用花括弧括起来。结构体成员的定义方式和变量的定义方式一样,成员类型可以是基本类型的,也可以是构造类型的。各成员之间用分号分隔。n结构体内的各个成员名不能重名,但成员名可以与结构体外其他标识符同名,并不产生冲突。10.1 结构体类型n结构体变量
3、的定义n用已经定义的结构体类型定义结构体变量。struct student stu;n定义结构体类型的同时定义结构体变量。stu1,stu2。struct student int number;/*学号*/char name8;/*姓名*/char sex;/*性别*/float score4;/*成绩*/stu1,stu2;10.1 结构体类型n定义无名结构体类型的同时定义结构体变量。这种定义形式省略了结构体名。不再需要定义此种类型变量的情况才可采用这种方式。struct int number;/*学号*/char name8;/*姓名*/char sex;/*性别*/float score
4、4;/*成绩*/stun结构体变量各个成员按照定义的顺序依次占用连续的空间。可以定义指针变量指向结构体类型变量。结构体变量的地址虽与其第一个成员的地址的值是相同的,但它们的类型是不同的。它们之间不能直接相互赋值,但是可以先将其用强制类型转换,转换为同一类型指针后相互赋值。10.1 结构体类型n结构体变量的初始化和引用n结构体变量的初始化n若在定义之后进行初始化操作,只能对每个成员单独进行赋值。n若在定义变量的同时进行初始化,则用一对花括弧括起各个成员值的列表并用赋值号和变量连接,成员值之间逗号分隔,具体格式为:结构体类型名结构体类型名 结构体变量结构体变量=成员值列表成员值列表;例如,例如,s
5、truct student stu=1001,wang,f,60.5,80,75,90;n结构体变量的引用n只能引用结构体变量的成员,不能引用整个结构体变量。结构体变量的成员引用形式为:结构体变量名结构体变量名.成员名成员名n其中“.”称为成员运算符。如果是通过指向结构体变量的指针引用结构体成员,形式为:(*指针变量名)指针变量名).成员名成员名 或或 指针变量名指针变量名-成员名成员名10.1 结构体类型n如果结构体的成员仍然是构造类型,则需要逐级引用,直至最低级的成员,即只能对结构体变量最低级的成员进行存取和运算。【例10.1】输入学生的各项信息,计算总分和平均成绩后输出。#include
6、 stdio.hstruct dateint year;int month;int day;/*定义结构体类型struct date*/struct studentint number;/*学号*/char name10;/*姓名*/struct date birthday;/*生日,struct date类型*/10.1 结构体类型float score4;/*四门课成绩*/float total;/*总分*/float ave;/*平均成绩*/;/*定义结构体类型struct student*/main()struct student stu,*p;int k;printf(please
7、enter number&name:);scanf(%d%s,&stu.number,stu.name);printf(please enter birthday(year,month,day):);scanf(%d%d%d,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day);printf(please enter the score(4):);10.1 结构体类型 for(stu.total=0,k=0;knumber);printf(name:%sn,p-name);printf(birthday:%d,%d,%dn,(*p)
8、.birthday.year,(*p).birthday.month,(*p).birthday.day);printf(score:);for(k=0;kscorek);printf(ntotal:%6.2f n,stu.total);10.1 结构体类型printf(average:%6.2f n,stu.ave);某次程序运行结果为:please enter number&name:1002 liplease enter birthday(year,month,day):1975 6 8please enter the score(4):80 78.5 92 83.5number:100
9、2name:libirthday:1975,6,8score:80.00 78.50 92.00 83.50total:334.00average:83.5010.1 结构体类型n结构体数组n结构体数组的定义、初始化n若数组元素的类型为结构体类型,数组为结构体数组。n定义结构体数组的同时也可对数组进行初始化操作。例如,struct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/stu3=461,liu,80,78,67,80,0,0,032
10、,geng,98,78,86,90,0,0,103,qian,79,89,68,80,0,0;n可以定义指向结构体数组元素的指针变量,然后通过指针对数组元素操作。10.1 结构体类型n结构体数组的引用n结构体数组元素也是通过数组名和下标来引用,但要注意只能对最低级的成员进行存取和运算。引用的一般形式为:数组名数组名下标下标.成员名成员名例如,stu1.number、stu0.score2、stu2.aven通过指针引用结构体数组元素的形式和通过指针引用结构变量形式一样,为:(*指针变量名)指针变量名).成员名成员名 或或 指针变量名指针变量名-成员名成员名 例如,语句“p=&stu1;”之后,
11、(*p).number、(p-1)-score2、p-ave;10.1 结构体类型【例10.2】计算某班期末考试中所有学生的总分和平均成绩。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;main()struct student stuN,*p;int i,k;for(i=0,p=stu;pnumber,p-name);printf(score(4):);for(p-to
12、tal=0,k=0;kscorek);p-total+=p-scorek;/*计算总成绩*/p-ave=p-total/4;/*计算平均成绩*/for(i=0;iN;i+)/*输出*/printf(number:%6dn,stui.number);printf(name:%sn,stui.name);printf(score:);for(k=0;k4;k+)printf(%6.2f,stui.scorek);printf(ntotal=%10.2f average=%10.2f n,stui.total,stui.ave);10.2结构体和函数n结构体变量的成员作为函数参数n结构体变量的成员可
13、作为函数的实际参数,但是不适合作函数的形式参数。n结构体变量的成员作函数实参的用法与普通变量作函数实参的用法相同,形参与实参之间仍然是“值传递”的方式。【例10.3】重新编写例10.2。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;10.2结构体和函数float total(float s,int n)/*计算总成绩*/int k;float sum=0;for(k=0
14、;kn;k+)sum+=sk;return(sum);float average(float x,int n)return(x/n);/*返回平均值*/main()struct student stuN;int i,k;for(i=0;iN;i+)/*输入学生的信息*/printf(the%d studentn,i);printf(number&name:);10.2结构体和函数 scanf(%d%s,&stui.number,stui.name);printf(score(4):);for(k=0;k4;k+)scanf(%f,&stui.scorek);stui.total=total(s
15、tui.score,4);/*计算总成绩*/stui.ave=average(stui.total,4);/*计算平均成绩*/for(i=0;iN;i+)/*输出*/printf(number:%6dn,stui.number);printf(name:%sn,stui.name);printf(score:);for(k=0;knumber,stu-name);printf(score(4):);10.2结构体和函数for(k=0;kscorek);void total_average(struct student*stu)/*计算总成绩和平均值*/int k;stu-total=0;for
16、(k=0;ktotal+=stu-scorek;stu-ave=stu-total/4;void output(struct student*stu)/*输出学生信息*/int k;printf(number:%6dn,stu-number);printf(name:%sn,stu-name);printf(score:);10.2结构体和函数for(k=0;kscorek);printf(ntotal=%10.2f average=%10.2f n,stu-total,stu-ave);main()struct student stuN,*p;int i;for(i=0;iN;i+)/*输入
17、学生的信息*/printf(the%d studentn,i);input(&stui);total_average(&stui);/*计算平均成绩*/printf(n);for(i=0;iN;i+)/*输出*/output(&stui);10.2结构体和函数n结构体数组作函数参数n向函数传递结构体数组实际也是传递数组的首地址。形参数组与实参数组使用共同的内存单元。n函数形参、实数是同类型的结构体数组名或结构体指针。【例10.5】重新编写例10.4。#define N 50#include stdio.hstruct studentint number;/*学号*/char name10;/*
18、姓名*/float score4;/*四门课程成绩*/float total;/*总分*/float ave;/*平均成绩*/;10.2结构体和函数void input(struct student stu,int n)/*输入学生的信息*/int i,k;for(i=0;in;i+)printf(the%d studentn,i);printf(number&name:);scanf(%d%s,&stui.number,stui.name);printf(score(4):);for(k=0;k4;k+)scanf(%f,&stui.scorek);void total_average(st
19、ruct student*stu,int n)/*计算总成绩和平均值*/int k;struct student*p;p=stu+n;10.2结构体和函数for(;stutotal=0;for(k=0;ktotal+=stu-scorek;stu-ave=stu-total/4;void output(struct student*stu,int n)/*输出处理后的学生信息*/int k,i;for(i=0;inumber);printf(name:%sn,(stu+i)-name);printf(score:);10.2结构体和函数 for(k=0;kscorek);printf(ntot
20、al=%10.2f average=%10.2f n,(stu+i)-total,(stu+i)-ave);main()struct student stuN;struct student*q=stu;input(q,N);total_average(stu,N);output(stu,N);10.3 动态数据结构链表n内存空间的动态分配和释放nfree函数nfree函数的的格式:void free(void*p);nfree函数的功能:释放指针变量p所指向的内存区,该函数没有返回值。一般p的值是调用malloc函数或calloc函数的返回值。nmalloc函数nmalloc函数的格式:voi
21、d*malloc(unsigned int size);nmalloc函数的功能:在内存的动态存储区中分配size个字节的连续空间,并返回分配空间的起始地址。若分配失败,则返回空指针。n注意:malloc函数的返回值一般是空类型的指针(有的编译系统将其处理成char类型的指针)。使用该函数时通常需要用强制类型转换,将其转换为所需要的类型。10.3 动态数据结构链表【例10.6】注意内存空间的分配和释放。main()double*pointer;pointer=(double*)malloc(sizeof(double);/*申请一个double类型变量所需内存空间*/*pointer=8.23
22、4;printf(“%6.4fn”,*pointer);*pointer=*pointer+10;printf(%7.4fn,*pointer);*pointer=*pointer/2;printf(%6.4f,*pointer);free(pointer);/*释放空间*/10.3 动态数据结构链表程序运行结果为:8.234018.23409.1170ncalloc函数ncalloc函数的的格式:nvoid*calloc(unsigned int n,unsigned int size);ncalloc函数的功能:分配内存的动态存储区中n个长度为size个字节的连续空间,并返回分配空间的起始
23、地址。若分配失败,则返回一个空指针。对calloc的返回值同样也可进行强制类型转换后使用。n注意:calloc函数常用来为一维数组分配空间,其中n表示数组的长度,size表示数组元素所占字节数。这种方式获得的数组一般称为动态数组。10.3 动态数据结构链表【例10.7】注意内存空间的分配和释放。main()int*a,i;a=(int*)calloc(5,sizeof(int);/*申请5个整型变量所需内存空间*/for(i=0;i5;i+)*(a+i)=i+1;for(i=0;ic=A;n1-next=n2;n2-c=B;n2-next=n3;n3-c=C;n3-next=NULL;for(
24、p=head;p!=NULL;p=p-next)printf(%3c,p-c);10.3 动态数据结构链表n链表的基本操作 为了简化链表的各种操作,一般在含有有效信息的所有为了简化链表的各种操作,一般在含有有效信息的所有结点之前再附加一个数据域不包含任何信息的结点。这个结点结点之前再附加一个数据域不包含任何信息的结点。这个结点被称为被称为“头结点头结点”。头结点的存在是以一个结点空间为代价换。头结点的存在是以一个结点空间为代价换取程序编写的简单明了。取程序编写的简单明了。下面的各项链表操作都是针对有头结点的链表编写的,结点的类型均为:struct nodeint data;struct nod
25、e*next;并假定成员data的值不可能为负数。10.3 动态数据结构链表n创建链表采用从表尾插入新结点的方式,则创建链表的主要步骤为:生成只含有头结点的空链表,头指针head和尾指针tail(指向链表的最后一个结点)均指向头结点。读取数据信息,申请新的结点空间,将数据存于新结点。将新结点插入到链表最后一个结点的后面,tail指针指向新插入的结点,重复的操作直到输入结束。尾结点指针域赋NULL。【例10.9】编写函数,在表尾插入结点生成单链表。struct node*createtail()struct node*head,*p,*tail;int data;head=(struct nod
26、e*)malloc(sizeof(struct node);/*生成头结点*/tail=head;/*尾指针指向最后一个结点*/scanf(%d,&data);/*读取数据*/10.3 动态数据结构链表while(data=0)p=(struct node*)malloc(sizeof(struct node);/*生成新结点p*/p-data=data;/*读入的数据存放到结点p的数据域*/tail-next=p;/*将新结点p插入到表尾*/tail=p;/*修改尾指针tail指向当前的尾结点*/scanf(%d,&data);/*读入下一个数据*/tail-next=NULL;/*将最后一
27、个结点的指针域置为空*/return(head);/*返回头指针*/10.3 动态数据结构链表10.3 动态数据结构链表10.3 动态数据结构链表若采用从表头插入新结点的方式,则创建链表的主要步骤为:生成只含有头结点的空链表,定义头指针head指向头结点。读取数据信息,申请新的结点空间,将数据存于新结点。将新结点插入到头结点后面。重复的操作直到输入结束。【例10.10】编写函数,在表头插入结点生成单链表。struct node*createhead()struct node*head,*p;int data;head=(struct node*)malloc(sizeof(struct nod
28、e);/*生成头结点*/head-next=NULL;/*置为空表*/scanf(“%d”,&data);/*读取数据*/while(data=0)p=(struct node*)malloc(sizeof(struct node);/*生成新结点p*/p-data=data;/*读入的数据存放到结点p的数据域*/10.3 动态数据结构链表 p-next=head-next;/*将新结点插入到头结点之后*/head-next=p;/*修改头结点的指针域指向新插入结点*/scanf(%d,&data);/*读入下一个数据*/return(head);/*返回头指针*/10.3 动态数据结构链表1
29、0.3 动态数据结构链表【例10.11】编写函数,输出单链表内容。void output(struct node*head)/*输出链表*/struct node*p;printf(the linklist is:n);p=head-next;/*指针变量p获得头结点后继结点的地址*/while(p!=NULL)/*判断指针变量p是否为NULL,为NULL表示链表结束*/printf(%6d,p-data);/*输出指针变量p结点的内容*/p=p-next;/*指针变量p指向链表下一个结点*/return;10.3 动态数据结构链表n删除结点在单链表中删除指定结点的主要步骤为:找到要删除的p结
30、点和p结点的前驱结点q(由于单向链表有头结点,所以前驱结点一定存在)。删除该结点:修改前驱结点的指针域指向待删除结点的后继结点,并释放被删除结点所占用的空间。注意:删除结点后,一定要释放被删除结点所占空间。否则,该结点会成为游离的、不可再用的空间。【例10.13】编写函数,在单链表中删除值为x的结点。struct node*delete(struct node*head,int x)/*从链表中删除值为x的结点*/struct node*p,*q;q=head;/*q指向头结点*/p=head-next;/*p指向第一个结点*/while(p&(p-data!=x)/*查找值为的结点p,查找过
31、程中,q指向p结点的前驱*/q=p;p=p-next;if(p)q-next=p-next;free(p);/*若找到,q结点的指针域指向p结点的后继,释放p*/else printf(not find!n);/*若未找到,输出相应的信息*/return(head);/*返回头指针*/10.3 动态数据结构链表10.3 动态数据结构链表n插入结点插入到p结点之后,相应C语句为:s-next=p-next;s的指针域指向p的后继结点。p-next=s;p的指针域指向新插入结点s。10.3 动态数据结构链表 在结点p之前插入新结点,首先要找到p的前驱结点q。相应C语句为:s-next=p;s的指针
32、域指向p。q-next=s;q的指针域指向新插入结点s。10.3 动态数据结构链表【例10.14】编写函数,在单链表中值为x的结点之前插入一个值为y的结点。struct node*insert(struct node*head,int x,int y)/*在链表值为x的结点前插入值为y的结点*/struct node*p,*q,*s;s=(struct node*)malloc(sizeof(struct node);/*生成新结点s*/s-data=y;/*将y存放在新结点中*/q=head;/*q指向头结点*/p=head-next;/*p指向第一个结点*/while(p-data!=x)
33、&p)/*寻找值为x的结点,若表非空且未找到时循环*/q=p;p=p-next;/*保持p指向当前结点,q指向p结点的前驱*/10.3 动态数据结构链表 if(p=NULL)/*未找值为x的结点,返回空*/printf(not find xn);free(s);return(head);s-next=p;/*插入s结点到p之前*/q-next=s;return(head);/*返回头指针*/10.3 动态数据结构链表【例10.15】链表的综合操作。#inlude data.h#inlude func.c#inlude stdio.hmain()struct node*head,*p;int x
34、,a,b;char ch;do printf(n1:createn2:searchn3:insertn4:deleten5:outputn0:exitn);printf(please select:);ch=getch();while(!(ch=0)ch=getch();/*输入不在0到5之间无效*/putchar(ch);printf(n);10.3 动态数据结构链表 switch(ch)case 1:/*若选择1,创建链表*/printf(please enter data:);head=createhead();/*创建链表*/output(head);/*输出创建后的链表*/break
35、;case 2:/*若选择2,在链表中查找数据*/printf(please enter data:);scanf(%d,&x);/*输入待查找的数据*/p=search(head,x);/*进行查找*/if(p!=NULL)printf(nthe data is:%d,p-data);else printf(n not found);break;10.3 动态数据结构链表 case 3:/*若选择,在链表中插入数据*/printf(please enter data(insert b before a)a,b:);scanf(%d%d,&a,&b);/*输入插入位置及数据*/head=ins
36、ert(head,a,b);/*进行插入*/output(head);/*输出插入后的链表*/break;case 4:/*若选择4,在链表中删除数据*/printf(please enter the data to delete:);scanf(%d,&a);/*输入要删除的数据*/head=delete(head,a);/*进行删除*/output(head);/*输出删除后的链表*/break;case 5:/*若选择5,输出链表数据*/output(head);10.3 动态数据结构链表 while(ch!=0);10.4枚举类型n枚举类型的定义n枚举类型的定义格式如下:enum 枚举
37、类型名枚举类型名枚举常量枚举常量1,枚举常量,枚举常量2,枚举常量,枚举常量n;enum weekSunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;nenum是用来定义枚举类型的关键字,枚举类型名应符合标识符定义的规则,enum和枚举类型名共同构成枚举类型的类型名。n花括弧内是该枚举类型所有可能的取值列表,也就是枚举常量列表。每个枚举常量都是有意义的标识符;n枚举常量表面上是标识符,实际存储的是整型值。在系统默认情况下,第一个枚举常量的值是0,以后每个枚举常量的值是前一个常量的值加1。枚举常量的值在定义后不能被修改。n枚举常量也可
38、显示赋值,未被显式赋值的枚举常量的值是前一个常量值加1。enum weekSunday=7,Monday=1,Tuesday,Wednesday,Thursday,Friday,Saturday;10.4枚举类型n枚举类型变量的定义和引用n枚举类型变量的定义n定义枚举类型的同时定义变量。enum colorsred,blue,green,yellow c1,c220;n先定义枚举类型,然后定义变量。enum colorsred,blue,green,yellow;enum colors c1,c220;n如果之后不再使用此枚举类型,可定义类型时省略枚举类型名并同时定义变量。enum red,b
39、lue,green,yellow c1,c220;n枚举类型变量的引用n枚举类型变量的取值范围只能是其枚举类型定义时所枚举的枚举常量。枚举常量可赋值给枚举变量。整型和枚举类型之间不能相互赋值,若要赋值,需进行强制类型转换。10.4枚举类型【例10.16】考虑程序执行结果,体会枚举类型的用法。main()enum colorsred,blue,green,yellow c1,c2;c1=blue;c2=(enum colors)1;if(c1=c2)printf(yes);else printf(no);程序运行结果为:yes10.4枚举类型n可以比较枚举类型变量的大小,枚举变量的比较相当于它们
40、所隐含整数值的比较。枚举变量可以作为循环变量来控制循环。【例10.17】考虑程序执行结果,体会枚举类型的用法。enum weekSunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;main()enum week w;int k=0;for(w=Sunday;wk是合法的引用。n说明:n给共用体变量赋值时,只能对共用体的一个成员赋值,而不能对整个共用体变量赋值。对共用体变量而言,只有最近一次被赋值的成员是有效的,其他成员无效。10.5共用体类型n共用体变量不能在定义时初始化。n若共用体的成员是构造类型的,则需要逐级引用至最低级的成员。
41、n共用体变量的地址和共用体各个成员的地址是相同的。但是它们的类型是不同的。【例10.19】学校某个协会既有学生成员又有教师成员,学生信息包括姓名、年龄、职业(学生S)和年级,教师信息包括姓名、年龄、职业(教师T)和职称。输入协会成员列表,并输出年龄小于25岁的成员信息。10.5共用体类型#define N 5#include stdio.hstruct associatorchar name10;/*姓名*/int age;/*年龄*/char job;/*职业*/union /*年级、职称的公用体*/int grade;char position10;category;10.5共用体类型ma
42、in()struct associator memberN;int i;printf(please enter associators:name age job grade/position:n);for(i=0;iN;i+)/*输入数据*/scanf(%s%d%c,memberi.name,&memberi.age,&memberi.job);if(memberi.job=S)scanf(%d,&memberi.category.grade);else scanf(%s,memberi.category.position);printf(associators(age25):n);for(i
43、=0;iN;i+)/*输入数据*/if(memberi.age25)printf(%s%d%c,memberi.name,memberi.age,memberi.job);10.5共用体类型if(memberi.job=S)printf(%dn,memberi.category.grade);else printf(%sn,memberi.category.position);输入5条信息,运行结果为:please enter associators:name age job grade/position:li 50 T professorwang 33 T professorzhang 24
44、 T lectorzhao 21 S 3liu 26 S 1associators(age25):zhang 24 T lectorzhao 21 S 310.6 用户自定义类型n用typedef声明基本类型定义基本类型的新类型名的形式为:typedef 基本类型名基本类型名 新类型名;新类型名;例如,typedef char CHARACTER;CHARACTER ch80,c;n用typedef声明构造类型n数组类型的声明定义数组类型的新类型名的形式为;typedef 新类型名新类型名数组长度数组长度;例如,typedef char STRING80;STRING str1,str2;10
45、.6 用户自定义类型n结构体、共用体类型的声明类型关键字(类型关键字(struct或或union)类型名)类型名 类型名类型名 成员名成员名1;类型名类型名 成员名成员名2;类型名类型名 成员名成员名n;typedef类型关键字(类型关键字(struct或或union)类型名)类型名 新类新类型名型名;10.6 用户自定义类型【例10.20】注意类型DATA使用。struct dataint year;int month;int day;typedef struct data DATA;main()DATA d;d.year=1990;d.month=7;d.day=9;printf(year
46、=%dmonth=%dday=%d,d.year,d.month,d.day);程序运行结果为:year=1990month=7day=910.6 用户自定义类型ntypedef类型关键字(类型关键字(struct或或union)类型名)类型名 类型名类型名 成员名成员名1;类型名类型名 成员名成员名2;类型名类型名 成员名成员名n;新类型名;新类型名;typedef struct dataint year;int month;int day;DATA;10.6 用户自定义类型ntypedef类型关键字(类型关键字(struct或或union)类型名类型名 成员名成员名1;类型名类型名 成员名
47、成员名2;类型名类型名 成员名成员名n;新类型名;新类型名;10.6 用户自定义类型【例10.21】注意类型TEST使用。typedef unionint x;float y;TEST;main()TEST d;d.x=99;printf(d=%dn,d.x);d.x=1.99;printf(d=%fn,d.y);程序运行结果为:d=99d=1.99000010.6 用户自定义类型n枚举类型的声明nenum 枚举类型名枚举类型名枚举常量列表枚举常量列表;typedef enum 枚举类型名枚举类型名 新类型名;新类型名;例如,enum colorsred,blue,green,yellow;typedef enum colors COLOR;ntypedef enum 枚举类型名枚举类型名枚举常量列表枚举常量列表新类型名;新类型名;例如,typedef enum colorsred,blue,green,yellow COLOR;ntypedef enum 枚举常量列表枚举常量列表 新类型名;新类型名;例如,typedef enum red,blue,green,yellow COLOR;n用户自定义类型的用途n减少书写工作量,增加程序可读性。n提高程序的可移植性。