1、 结构定义和结构变量的引用结构定义和结构变量的引用 结构数组结构数组 指向结构的指针指向结构的指针 结构与函数结构与函数 引用自身的结构引用自身的结构 字段结构字段结构 联合联合 枚举枚举 本章内容本章内容结构定义结构定义 结构变量的作用结构变量的作用 结构变量的初始化结构变量的初始化 结构类型定义的一般形式:结构类型定义的一般形式:struct struct 结构名结构名 成员表列成员表列 ;说明:说明:花括号内是该结构中的各个成员花括号内是该结构中的各个成员 (或称分量或称分量),由它们组成一个结构。,由它们组成一个结构。对各成员都应进行类型说明,即:对各成员都应进行类型说明,即:类型标识
2、符类型标识符 成员名成员名例如,描述学生的结构类型定义为:例如,描述学生的结构类型定义为:struct Studentstruct Student int num;/int num;/*学号学号*/char name20;/char name20;/*姓名姓名*/char sex;/char sex;/*性别性别*/int age;/int age;/*年龄年龄*/float score;/float score;/*成绩成绩*/char addr50;/char addr50;/*地址地址*/;1 1、先定义结构类型再定义结构变量、先定义结构类型再定义结构变量 格式:格式:struct st
3、ruct 结构名结构名,变量变量1,1,变量变量2,2,;structstruct studentstudent int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr50;char addr50;用用studentstudent直接定义变量。如:直接定义变量。如:student student1,student2;student student1,student2;2 2、在定义结构类型的同时定义变量、在定义结构类型的同时定义变量 格
4、式:格式:struct struct 结构名结构名 成员表列成员表列;变量名表列变量名表列;struct studentstruct student int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr50;char addr50;student1,student2;student1,student2;3 3、直接直接定义结构类型变量定义结构类型变量格式:格式:struct struct 成员表列成员表列;变量名表列;变量名表列;st
5、ruct struct int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr50;char addr50;student1,student2;student1,student2;结构类型与结构变量是不同的,结构变结构类型与结构变量是不同的,结构变 量是先定义一个结构类型,后定义结构量是先定义一个结构类型,后定义结构 变量为该类型。变量为该类型。只能对结构变量赋值、存取或运算,不只能对结构变量赋值、存取或运算,不 能对一个类型赋值、存取
6、或运算。编译能对一个类型赋值、存取或运算。编译 时,不能对类型分配存储空间,只能对时,不能对类型分配存储空间,只能对 变量分配存储空间。变量分配存储空间。对结构中的成员对结构中的成员(即即“域域”),可以单独,可以单独使使 用,它的作用与地位相当于普通变量。用,它的作用与地位相当于普通变量。结构成员也可以是一个结构变量。结构成员也可以是一个结构变量。结构成员也可以是一个结构变量结构成员也可以是一个结构变量,例如:例如:struct datestruct date int month;/int month;/*月月 */int day;/int day;/*日日 */int year;/int
7、year;/*年年 */;struct studentstruct student int num;int num;char name20;char name20;char sex;char sex;int age;int age;struct date birthday;struct date birthday;char addr30;char addr30;student1,student2;student1,student2;不能将一个结构变量作为一个整体进行赋值和输出。不能将一个结构变量作为一个整体进行赋值和输出。如:如:printf(printf(”%d,%s,%c,%d,%f,%s
8、n%d,%s,%c,%d,%f,%sn”,student1),student1);只能对结构变量中的各个成员分别输出。只能对结构变量中的各个成员分别输出。引用格式:引用格式:结构变量名结构变量名.成员名成员名 例如:例如:student1.num=10001;student1.num=10001;说明:说明:”.”是结构成员运算符,在所有的运算符中是结构成员运算符,在所有的运算符中 优先级最高,因此可以把优先级最高,因此可以把student1.numstudent1.num作作 为一个整体来看待。为一个整体来看待。注:新的标准已允许将一个结构变量直接赋值给另注:新的标准已允许将一个结构变量直接
9、赋值给另 一个具有相同结构的结构变量。一个具有相同结构的结构变量。如果成员本身又属一个结构类型,则要用若干个如果成员本身又属一个结构类型,则要用若干个 成员运算符,一级一级地找到最低一级的成员。成员运算符,一级一级地找到最低一级的成员。只能对最低级的成员进行赋值或存取及运算。只能对最低级的成员进行赋值或存取及运算。例例 如如:对前面说明的结构变量对前面说明的结构变量student1,student1,可以这样访可以这样访 问成员:问成员:student1.numstudent1.num student1.name student1.name student1.birthday.month st
10、udent1.birthday.month student1.birthday.day student1.birthday.day student1.birthday.year student1.birthday.year对结构成员对结构成员(分量分量)可以像普通变量一样进行各种运算。可以像普通变量一样进行各种运算。例如:例如:student2.score=student1.score;student2.score=student1.score;sum=student1.score+student2.score;sum=student1.score+student2.score;student
11、1.age+;student1.age+;可以引用成员的地址,也可以引用结构变量的地址。可以引用成员的地址,也可以引用结构变量的地址。例如:例如:scanf(scanf(”%d%d”,&student1.num);,&student1.num);/*输入输入student1.numstudent1.num的值的值*/printf(printf(”%0n%0n”,&student1);,&student1);/*输出输出student1student1的首地址的首地址*/但不能用以下语句整体读入结构变量,如:但不能用以下语句整体读入结构变量,如:scanf(scanf(”%d%s%c%d%f%s
12、%d%s%c%d%f%s”,&student1);,&student1);#include#include void main()void main()static struct student static struct student int num;int num;char name char name2020;char sex;char sex;char addr char addr3030;a=10010,“Li Lin”,M,“100 Beijing Road”a=10010,“Li Lin”,M,“100 Beijing Road”printf(“NO:%dnname:%snse
13、x:%cnaddress:%sn”,a.nuprintf(“NO:%dnname:%snsex:%cnaddress:%sn”,a.num,a.name,a.sex,a.addr);m,a.name,a.sex,a.addr);程序运行结果:程序运行结果:NO:10010 NO:10010 name:Li Lin name:Li Lin sex:M sex:M address:100 Beijing Road address:100 Beijing Road 9.2.1 9.2.1 结构数组的定义结构数组的定义 与定义结构变量的方法相似,只需说明其为数组即可。与定义结构变量的方法相似,只需说明
14、其为数组即可。例如:例如:struct student struct student int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr30;char addr30;struct student stu30;struct student stu30;新的标准新的标准C C版本不仅允许对全局的或静态的存储类结版本不仅允许对全局的或静态的存储类结构数组,而且允许对自动存储类结构数组初始化。如:构数组,而且允许对自动存储类结构数组初始化。
15、如:struct student struct student int num;int num;char name20;char name20;char sex;char sex;int age;int age;float score;float score;char addr30;char addr30;stu3=stu3=10001,10001,“Li LinLi Lin”,M M,17,86.5,17,86.5,“103 Beijing Road103 Beijing Road”,10002,10002,“Zhang FunZhang Fun”,M M,18,96,18,96,“130
16、Shanghai Road130 Shanghai Road”,10003,10003,“Wang MinWang Min”,F F,19,83.5,19,83.5,“180,Wuhan Road180,Wuhan Road”;定义数组时,元素个数可以不指定。定义数组时,元素个数可以不指定。例如:例如:stu=stu=,;编译时,系统会根据给出初值的结构常量编译时,系统会根据给出初值的结构常量的个数来确定数组元素的个数。的个数来确定数组元素的个数。对结构数组初始化,也可以采用先定义对结构数组初始化,也可以采用先定义 结构类型名,然后在说明结构数组时进结构类型名,然后在说明结构数组时进 行初始化
17、。行初始化。程序运行结程序运行结果如下:果如下:Li Li Zhang Wang Li 2 Zhang 1 Wang 1【例例9.29.2】编写对候选人得票的统计程序。设有编写对候选人得票的统计程序。设有3 3个候选人,个候选人,每次输入每次输入1 1个得票的候选人的名字,要求最后输出各人得票个得票的候选人的名字,要求最后输出各人得票的结果。的结果。struct personstruct person char name20;char name20;int count;int count;leader3=”Li”,0,”Zhang”,0,”Wang”,0;leader3=”Li”,0,”Zha
18、ng”,0,”Wang”,0;#include#include void main()void main()int i,j int i,j char leader_name20;char leader_name20;for(i=1;i4;i+)for(i=1;i4;i+)scanf(”%s”,leader_name);scanf(”%s”,leader_name);for(j=0;j3;j+)for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)if(strcmp(leader_name,leaderj.name)=0)leaderj.coun
19、t+;leaderj.count+;printf(”n”);printf(”n”);for(i=0;i3;i+)for(i=0;iscorepstu-score 以下三种形式是等价的:以下三种形式是等价的:a.a.结构变量名结构变量名.成员名;成员名;b.(b.(*pstu).pstu).成员名;成员名;c.pstu-c.pstu-成员名。成员名。-(减号和大于号减号和大于号)也是一种运算符。它也是一种运算符。它 表示的意义是访问指针所指向的结构中表示的意义是访问指针所指向的结构中 的成员项。的成员项。【例例9.39.3】结构指针在程序中的使用。程序如下:结构指针在程序中的使用。程序如下:st
20、ruct studentstruct studentint num;int num;char name20;char name20;char sex;char sex;int age int age;stu3=10001,stu3=10001,”Li LinLi Lin”,M M,17,17,10002,10002,”Zhang FunZhang Fun”,M M,18,18,10003,10003,”Wang MinWang Min”,F F,19;,19;#include#include void main()void main()struct student struct student
21、*pstu;printf(pstu;printf(”No.name sex agenNo.name sex agen”););for(pstu=stu;pstustu+3;pstu+)for(pstu=stu;pstunum,pstu-name,pstu-num,pstu-name,pstu-sex,pstu-age);pstu-sex,pstu-age);程序运行结果如下:程序运行结果如下:No.name sex ageNo.name sex age10001 Li Lin M 1710001 Li Lin M 1710002 Zhang Fun M 1810002 Zhang Fun M
22、1810003 Wang Min F 1910003 Wang Min F 19一、结构用作函数的参数一、结构用作函数的参数 新的新的C C标准允许用整个结构作为函数的参数传标准允许用整个结构作为函数的参数传递,但必须保证实参与形参的类型相同。递,但必须保证实参与形参的类型相同。说明说明:把一个完整的结构变量作为参数递,虽把一个完整的结构变量作为参数递,虽 然合法,但要将全部成员值一个个传递,然合法,但要将全部成员值一个个传递,费时间又费空间,开销大。如果结构类费时间又费空间,开销大。如果结构类 型还有一些成员是数组,则程序运行的型还有一些成员是数组,则程序运行的 效率会大大降化。在这种情况下
23、,用指效率会大大降化。在这种情况下,用指 针作函数参数比较好,能提高运行效率。针作函数参数比较好,能提高运行效率。【例例9.49.4】结构变量结构变量stustu内含学生学号、姓名和三门课的成绩。要内含学生学号、姓名和三门课的成绩。要 求在求在main()main()函数中赋值,在另外一个函数函数中赋值,在另外一个函数printprint中将它中将它 们打印输出。程序如下:们打印输出。程序如下:#define format#define format”%dn%sn%fn%fn%fn%dn%sn%fn%fn%fn”struct studentstruct studentint num;int n
24、um;char name20;char name20;float score3;float score3;#include#include void main()void main()void print();void print();struct student stu;struct student stu;stu.num=10001;stu.num=10001;strcpy(stu.name,strcpy(stu.name,”Fun junFun jun”););stu.score0=76.8;stu.score0=76.8;stu.score1=98;stu.score1=98;stu.
25、score2=87.6;stu.score2=87.6;print(&stu);print(&stu);void print(p)void print(p)struct student struct student*p;p;printf(format,p-num,p-name,printf(format,p-num,p-name,p-score0,p-score1,p-score0,p-score1,p-score2);p-score2);printf(printf(“nn”););程序运行结果如下:程序运行结果如下:1000110001 Fun jun Fun jun 76.800000 7
26、6.800000 99.000000 99.000000 87.59998 87.59998二、函数返回结构值二、函数返回结构值 当函数返回值是结构变量时,该函数称为结当函数返回值是结构变量时,该函数称为结构型函数。构型函数。旧的旧的C C标准不允许把结构变量作为函数返回值标准不允许把结构变量作为函数返回值使用。为建立结构与函数的联系,仍然要通过使用。为建立结构与函数的联系,仍然要通过指针,即函数可以返回指向结构的指针。返回指针,即函数可以返回指向结构的指针。返回结构指针的函数称为结构指针型函数。新的结构指针的函数称为结构指针型函数。新的C C标标准增加了支持结构变量作为函数返回值的功能。准增
27、加了支持结构变量作为函数返回值的功能。结构型函数定义的一般形式:结构型函数定义的一般形式:struct struct 结构名结构名 函数名函数名()();其中结构名必须在前面已经被定义过。其中结构名必须在前面已经被定义过。【例例9.59.5】有有4 4个学生,每个学生的数据包括学号、姓名、成绩,个学生,每个学生的数据包括学号、姓名、成绩,要求写一函数找出成绩最高者的姓名和成绩。程序如下:要求写一函数找出成绩最高者的姓名和成绩。程序如下:struct studentstruct student int num;int num;char name20;char name20;int score;i
28、nt score;#include#include void main()void main()struct student tmp,fimax();struct student tmp,fimax();tmp=fimax();tmp=fimax();printf(”The maximum score:n”);printf(”The maximum score:n”);printf(”No.%dn name:%sn score:%dn”,tmp.num,tmp.name,tmp.score);printf(”No.%dn name:%sn score:%dn”,tmp.num,tmp.name
29、,tmp.score);struct student fimax()struct student fimax()struct student stu4;struct student stu4;int i,j=0,max;int i,j=0,max;for(i=0;i4;i+)for(i=0;i4;i+)scanf(”%d%s%d”,&stui.num,stui.name,&stui.score);scanf(”%d%s%d”,&stui.num,stui.name,&stui.score);max=stu0.score;max=stu0.score;for(i=1;i4;i+)for(i=1;
30、imax)max=stui.score;j=i;if(stui.scoremax)max=stui.score;j=i;return(stuj);return(stuj);程序运行结果如下:程序运行结果如下:101 Li 90101 Li 90 102 Tan 68 102 Tan 68 103 Wang 98 103 Wang 98 104 Fun 89 104 Fun 89 The maximum score:The maximum score:No.103 No.103 NameWang NameWang Score98 Score981 1、引入:、引入:、程序中定义的数据,在其生存期
31、内即使不再使用,仍然占、程序中定义的数据,在其生存期内即使不再使用,仍然占 据内存空间,造成内存的浪费;据内存空间,造成内存的浪费;、语言定义数组时必须确定其长度,但有时又需要存放一、语言定义数组时必须确定其长度,但有时又需要存放一 组个数不定的数据;因此需要长度可变的数组;组个数不定的数据;因此需要长度可变的数组;2 2、动态分配内存的库函数:、动态分配内存的库函数:、void void*malloc(unsigned int size);malloc(unsigned int size);功能:在内存中分配一个长度为功能:在内存中分配一个长度为sizesize的连续存储单元;的连续存储单元
32、;返回值:所分配内存空间的首地址;若分配不成功,返回空指返回值:所分配内存空间的首地址;若分配不成功,返回空指针针(NULL)(NULL)注意:该函数的返回值类型是指向注意:该函数的返回值类型是指向voidvoid数据类型的指针,使用数据类型的指针,使用 时通常要进行类型转换,转换为所需要的数据类型。时通常要进行类型转换,转换为所需要的数据类型。float float*p;p=(float p;p=(float*)malloc(10)malloc(10*sizeof(float);sizeof(float);也可以由编译器自动进行类型转换:也可以由编译器自动进行类型转换:p=malloc(10
33、p=malloc(10*sizeof(float);sizeof(float);p p就指向了就指向了1010个个floatfloat类型的连续内存单元的第类型的连续内存单元的第0 0个单元,通过个单元,通过 *(p+i)(p+i)或或pipi就可以访问第就可以访问第i i个个floatfloat类型的内存单元。类型的内存单元。也就是说:可以将也就是说:可以将p p作为一个数组来使用,而这个数组是个动作为一个数组来使用,而这个数组是个动 态数组:态数组:(在程序运行时分配内存空间,数组长度可以在运行在程序运行时分配内存空间,数组长度可以在运行 时指定,使用完毕又可以将它释放时指定,使用完毕又可
34、以将它释放)。、void free(void void free(void*block);block);作用:释放由作用:释放由blockblock所指向的内存区所指向的内存区 返回值:返回值:freefree函数无返回值函数无返回值 注意:注意:blockblock的值应当是内存分配函数的返回值的值应当是内存分配函数的返回值 例:例:free(p);free(p);、void void *malloc(unsigned int n,unsigned int size);malloc(unsigned int n,unsigned int size);作用:在内存中分配作用:在内存中分配n n
35、个长度为个长度为sizesize的连续内存单元的连续内存单元 返回值:所分配内存空间的首地址;若分配不成功,返回返回值:所分配内存空间的首地址;若分配不成功,返回NULLNULL 注意:通常也需要进行类型转换注意:通常也需要进行类型转换、void exit(int status);void exit(int status);作用:结束程序的执行作用:结束程序的执行说明:说明:statusstatus参数定义了程序的退出状态。参数定义了程序的退出状态。0 0通常表示正常退出,通常表示正常退出,非非0 0表示错误。表示错误。例例7.197.19:int int*p;p;unsigned i,n;u
36、nsigned i,n;scanf(%u,&n);scanf(%u,&n);p=(int p=(int*)malloc(n,sizeof(int);)malloc(n,sizeof(int);if(p=NULL)if(p=NULL)/*p=(int p=(int*)malloc(n,sizeof(int);)malloc(n,sizeof(int);*/for(i=0;in;i+)for(i=0;in;i+)scanf(%d,&pi);/scanf(%d,&pi);/*p+i p+i*/l 所谓引用自身的结构,即在结构中的某个成员是指向所谓引用自身的结构,即在结构中的某个成员是指向该结构本身的
37、指针。该结构本身的指针。例如:例如:struct node struct node float number;float number;sturct node sturct node*next;next;list,list,*head;head;说明:说明:如果每一个结构中都包含指向另一个或几个结如果每一个结构中都包含指向另一个或几个结 构的指针,那么通过这些指针可以把许多结构构的指针,那么通过这些指针可以把许多结构 连接起来。这是计算机内表示有向图的一种方连接起来。这是计算机内表示有向图的一种方 法。法。例例9.6 9.6 使用链表将输入的正数序列按相反的顺序输出。使用链表将输入的正数序列按
38、相反的顺序输出。程序如下:程序如下:#include”stdio.h”#include”stdio.h”struct nodestruct node int number;int number;struct node struct node*next;next;#include#include void main()void main()struct node struct node*makelist();makelist();printf(”printf(”输入正数,用输入负数结束。输入正数,用输入负数结束。n”);n”);printf(”printf(”输入正数序列:输入正数序列:n”);
39、n”);printlist(makelist();printlist(makelist();30 NULL301301struct node struct node*makelist()makelist()struct node struct node*oldptr,oldptr,*head,head,*nalloc();nalloc();int newnum;int newnum;head=NULL;head=NULL;scanf(”%d”,&newnum);scanf(”%d”,&newnum);while(newnum=0)while(newnum=0)oldptr=head;oldpt
40、r=head;head=nalloc();head=nalloc();head-number=newnum;head-number=newnum;head-next=oldptr;head-next=oldptr;scanf(”%d”,&newnum);scanf(”%d”,&newnum);return(head);return(head);NULLheadheadheadhead301pp20 30140140130 NULL401301head401301head20 30150150130 NULLp10 401501 printlist(listhead)printlist(list
41、head)struct node struct node*listhead;listhead;while(listhead!=NULL)while(listhead!=NULL)printf(printf(”%d%d”,listhead-number);,listhead-number);listhead=listhead-next;listhead=listhead-next;struct node struct node*nalloc()nalloc()char char*malloc();malloc();return(struct node return(struct node*)ma
42、lloc(sizeof)malloc(sizeof(struct node);(struct node);运行结果如下:运行结果如下:1 1 2 2 3 3 4 4带冒号的成员是不带冒号的成员是不满一个字的整型数满一个字的整型数据。据。对取值不大的整型数据,如要节省存储空间,可在一个对取值不大的整型数据,如要节省存储空间,可在一个字内存字内存放几个数据。例如,用数据作标志时,一位就足够了,称放几个数据。例如,用数据作标志时,一位就足够了,称之为标之为标志位。标志位的值要么是志位。标志位的值要么是1 1,要么是,要么是0 0。在。在C C语言中,不满一语言中,不满一个字个字的整型变量,也可以作结
43、构成员,请看下例。的整型变量,也可以作结构成员,请看下例。例例9.7 9.7 用结构的字段成员存储数据并输出。程序如下:用结构的字段成员存储数据并输出。程序如下:#include#include void main()void main()struct struct unsigned a:1;unsigned a:1;unsigned b:2;unsigned b:2;unsigned c:3;unsigned c:3;int d;int d;s;s;s.a=1;s.b=2;s.c=3;s.d=4;s.a=1;s.b=2;s.c=3;s.d=4;printf(”%dn%dn%dn%dn”,s.
44、a,s.b,s.c,s.d);printf(”%dn%dn%dn%dn”,s.a,s.b,s.c,s.d);在结构定义中,成员后面有冒号和数字。在结构定义中,成员后面有冒号和数字。冒号:带冒号的成员是不满一个字的整型数据。冒号:带冒号的成员是不满一个字的整型数据。说明:说明:带冒号的成员叫字段,其是无正负的量。带冒号的成员叫字段,其是无正负的量。字段必须用类型保留字字段必须用类型保留字unsignedunsigned来定义。来定义。冒号后的数字表示字段的二进位长度。其值要小冒号后的数字表示字段的二进位长度。其值要小 于字长。若字长为于字长。若字长为1616位,则这个数字必须小于位,则这个数字必
45、须小于1616。若几个字段超过一个字的长度,编译程序就把刚若几个字段超过一个字的长度,编译程序就把刚 好超过的那个字段移到下一个字中。这时,上一好超过的那个字段移到下一个字中。这时,上一 个字中会有若干位不被使用。个字中会有若干位不被使用。注:若想强制某字段放在一个字的开始注:若想强制某字段放在一个字的开始 部分,则只要在该字段的前面写一个部分,则只要在该字段的前面写一个 没有字段名的成员即可。没有字段名的成员即可。如:如:int a:1;int :0;int b:2;(1)(1)字段不存在地址,不能使用运算符字段不存在地址,不能使用运算符&,因此无指向字段的指针;因此无指向字段的指针;(2)
46、(2)字段的长度不能大于存储单元的长字段的长度不能大于存储单元的长 度,也不能定义字段数组;度,也不能定义字段数组;(3)(3)字段可以在数值表达式中引用,它字段可以在数值表达式中引用,它 会被系统自动地转换成整型数。会被系统自动地转换成整型数。上例字段上例字段b便成为一个字的开始字段了。对于不想使用便成为一个字的开始字段了。对于不想使用的字段,就像上面那样,不写字段名,代替的字段,就像上面那样,不写字段名,代替0写出位数,写出位数,这样的字段叫无名字段,可以用来填空。这样的字段叫无名字段,可以用来填空。联合:将不同类型的数据存放在同一个地方,且占据联合:将不同类型的数据存放在同一个地方,且占
47、据 同样大小的存储空间。同样大小的存储空间。说明:联合类型的定义及联合变量的定义方法与结构说明:联合类型的定义及联合变量的定义方法与结构 的相应定义相同,只要将结构类型定义和结构的相应定义相同,只要将结构类型定义和结构 变量定义中保留字变量定义中保留字structstruct改成保留字改成保留字unionunion即可。即可。例如:例如:union utag union utag int ival;int ival;float fval;float fval;char char*pval;pval;uval;uval;说明:对联合能取它的地址和访问它的成员。访问联合说明:对联合能取它的地址和访
48、问它的成员。访问联合 成员的方法与访问结构成员的方法一样。成员的方法与访问结构成员的方法一样。访问联合成员的方法:联合变量名访问联合成员的方法:联合变量名.成员名成员名 如:如:uval.ival uval.ival 表示当前引用的是整型成员表示当前引用的是整型成员 uval.pval uval.pval 表示当前引用的是字符型指针成员表示当前引用的是字符型指针成员 例如:例如:structstruct char char *name;name;int flags;int flags;int utype;int utype;union union int ival;int ival;float
49、 fval;float fval;char char*pval;pval;uval;uval;symtabNSYM;symtabNSYM;说明:说明:symtabsymtab是一个结构数组,数组中每个结是一个结构数组,数组中每个结 构有一个成员是联合。构有一个成员是联合。访问联合成员访问联合成员ival,ival,应写成:应写成:symtabi.uval.ivalsymtabi.uval.ival例:字符串例:字符串pvalpval中的第一个字符的引用应写成:中的第一个字符的引用应写成:*symtabi.uval.pvalsymtabi.uval.pval枚举:指将变量的值一一列举出来,变量的
50、值只限枚举:指将变量的值一一列举出来,变量的值只限 于列举出来的值的范围内。于列举出来的值的范围内。说明:定义一个变量是枚举类型,可以先定义一个说明:定义一个变量是枚举类型,可以先定义一个 枚举类型名,然后再说明这个具体变量是该枚举类型名,然后再说明这个具体变量是该 枚举类型,也可以直接定义枚举类型变量。枚举类型,也可以直接定义枚举类型变量。例如:例如:enum weekday enum weekday sun,mon,tue,wed,thu,fri,sat;sun,mon,tue,wed,thu,fri,sat;说明:定义了一个枚举类型名说明:定义了一个枚举类型名weekdayweekday