1、第七章第七章 结构体、共用体和枚举类型数据结构体、共用体和枚举类型数据(教材P244)7.1 结构体类型数据概述结构体类型数据概述 一、结构体类型的引入一、结构体类型的引入 简单变量:简单变量:数组:数组:结构体类型:结构体类型:2022-11-111二、结构体类型的不确定性二、结构体类型的不确定性结构体类型中包含的数据项因问题而异,是不确定的。结构体类型必须由用户自行定义。结构体类型中的数据项称为结构体的成员(或称为域)。2022-11-112三、结构体类型的定义三、结构体类型的定义 struct 结构体名结构体名结构体成员;结构体成员;struct studentchar name20;c
2、har sex;int age;float score;;结构体类型的定义形式为结构体类型的定义形式为 类型标识符2022-11-113struct timeint hour;int minute;int second;类型标识符struct time int hour,minute,second;注意,此处成员不是变量,程序中完全可以用这些名字作为其它的变量名来使用(但必须另行定义)。2022-11-1147.2 结构体类型变量结构体类型变量 一、结构体类型变量的定义一、结构体类型变量的定义 结构体类型在一个函数内只能定义一次,如结构体类型在一个函数内只能定义一次,如果是全局的,则在整个源程
3、序中只能定义一果是全局的,则在整个源程序中只能定义一次。而结构体类型变量则可以定义多个。次。而结构体类型变量则可以定义多个。结构体类型变量的定义方式有三种:结构体类型变量的定义方式有三种:2022-11-115struct student stud1,stud2;struct time t1,t2,t3;struct studentchar name20;char sex;int age;float score;;1、单独定义单独定义:即先定义结构体类型,然后单独定即先定义结构体类型,然后单独定义结构体类型的变量。义结构体类型的变量。注意,结构体关键字struct和结构体名必须作为一个整体使用
4、。struct timeint hour;int minute;int second;2022-11-116struct student stud3,stud4;struct time t;struct studentchar name20;char sex;int age;float score;stud1,stud2;2、同时定义同时定义:即在定义结构体类型时,同时即在定义结构体类型时,同时给出变量名。给出变量名。struct timeint hour;int minute;int second;t1,t2,t3;2022-11-1173、直接定义直接定义:即在定义结构体类型时不指定结即在
5、定义结构体类型时不指定结构体名,只给出变量名。构体名,只给出变量名。这时结构体类型变量必须一次定义完,因为没有结构体名,不可能再单独定义。struct char name20;char sex;int age;float score;stud1,stud2;struct int hour;int minute;int second;t1,t2,t3;2022-11-118(1)不要将结构体名与变量名混淆。(2)结构体成员的类型可以是另一个已定义的结构体类型,形成嵌套结构。例如在定义结构体类型变量时,应注意以下几点:在定义结构体类型变量时,应注意以下几点:2022-11-119struct da
6、teint month;int day;int year;;struct studentchar name20;char sex;struct date birthday;float score;;若定义若定义struct student stud1;则则stud1的数据结构为的数据结构为namesexbirthdayscoremonthdayyear2022-11-1110二、结构体变量的初始化二、结构体变量的初始化 struct time t1=14,35,55,t2;struct student stud=“zhangsan”,m,11,25,1980,95.5;2022-11-1111
7、三、结构体变量的引用三、结构体变量的引用 结构体变量的成员可被作为普通的变量结构体变量的成员可被作为普通的变量使用,包括赋值、运算、使用,包括赋值、运算、I/O等操作。等操作。成员的引用形式为成员的引用形式为:结构体变量结构体变量.成员名成员名 1、结构体变量中成员的引用、结构体变量中成员的引用 2022-11-1112main()struct studentchar name20;char sex;int age;float score;struct student stud1=“zhangsan”,m,20,95.5,stud2;gets(stud2.name);stud2.sex=f;s
8、tud2.age=stud1.age-2;stud2.score=stud1.score;stud2.age+;printf(“%s is”,stud2.name);if(stud2.sex=f)printf(“female”);else printf(“male”);printf(“whose age is%d and score is%6.2fn”,stud2.age,stud2.score);scanf(“%s”,stud2.name);输入:输入:lili显示:显示:lili is female whose age is 19 and score is 95.50 2022-11-11
9、13一般仅限于赋值。一般仅限于赋值。2、结构体变量作为整体的引用、结构体变量作为整体的引用 main()struct dateint month,day,year;olddate=4,30,2007;struct date newdate;newdate=olddate;newdate.year+=10;printf(“The date of ten years later is%d.%d.%dn”,newdate.year,newdate.month,newdate.day);显示:显示:The date of ten years later is 2017.4.30 2022-11-111
10、4通常结构体变量作为整体使用时不用于输入输出。通常结构体变量作为整体使用时不用于输入输出。四、结构体的输入输出四、结构体的输入输出 main()struct timeint hour;int minute;int second;t;scanf(“%d,%d,%d”,&t.hour,&t.minute,&t.second);printf(“%d:%d:%dn”,t);虽然输入:虽然输入:14,35,55可正确显示:可正确显示:14:35:55但不提倡使用但不提倡使用.2022-11-1115main()struct studentchar name20;char sex;int age;floa
11、t score;stud=“zhangsan”,m,20,95.5;printf(“%s,%c,%d,%fn”,stud);可将printf函数中stud改为stud.name,stud.sex,stud.age,stud.score。输出时将产生错误。为什么?如何改正?输出时将产生错误。为什么?如何改正?2022-11-1116五、位运算及位段五、位运算及位段 位位(bit):每一个):每一个0或或1称为一个称为一个“位位”(bit)字节字节(byte):):8位构成一个字节(位构成一个字节(byte)内存地址内存地址:每一个字节均有一个编号:每一个字节均有一个编号一)、位运算一)、位运算
12、2022-11-11171、按位与运算符、按位与运算符&参与运算的两个量按照对应的位进行与运算,且参与运算的两个量按照对应的位进行与运算,且0&00,0&10,1&00,1&112、按位或运算符、按位或运算符|参与运算的两个量按照对应位进行或运算,且参与运算的两个量按照对应位进行或运算,且0|00,0|11,1|01,1|113、按位异或运算符、按位异或运算符 参与运算的两个量按照对应的位进行异或运算,且参与运算的两个量按照对应的位进行异或运算,且000,011,101,110 2022-11-11184、按位取反运算符、按位取反运算符 位运算符中唯一的位运算符中唯一的单目单目运算符,即将数的
13、每一位取运算符,即将数的每一位取反(反(01,10)。)。5、左移运算符、左移运算符将一个数的各二进制位全部将一个数的各二进制位全部右移若干位右移若干位。右移后,右边。右移后,右边移出的位被舍弃移出的位被舍弃,左边补入的位分两种情况:,左边补入的位分两种情况:对对无符号无符号数,左边补入数,左边补入0对对有符号有符号数,若符号位为数,若符号位为0(正数)则补入(正数)则补入0;若符号位;若符号位为为1(负数)则补入(负数)则补入1。每右移一位相当于除以每右移一位相当于除以2,由于上述规则,对于负数亦,由于上述规则,对于负数亦成立。但仅适用于成立。但仅适用于右边没有右边没有1被移出被移出的情况。
14、的情况。2022-11-11201、位段及其定义、位段及其定义位段位段是一种特殊的结构体成员,这些成员允许以是一种特殊的结构体成员,这些成员允许以位位为单位进行定义和存储,可以作为独立的量参与操为单位进行定义和存储,可以作为独立的量参与操作和运算。作和运算。二)、二)、位段位段 教材教材P253例例7.4、7.5、7.6 2022-11-11212、位段的引用方法、位段的引用方法引用方法与结构体成员的引用相同。例如引用方法与结构体成员的引用相同。例如word.a,word.b使用位段应注意以下几方面:使用位段应注意以下几方面:1、位段只能是、位段只能是int或或unsigned int型型2、
15、不能引用位段的地址(如、不能引用位段的地址(如&word.a)3、若给位段赋的值超出其最大值,则仅截取其有效位、若给位段赋的值超出其最大值,则仅截取其有效位 2022-11-1122复习1、结构体类型的引入、结构体类型的引入2、结构体类型的不确定性、结构体类型的不确定性1、结构体类型变量的定义结构体类型变量的定义3、结构体类型的定义、结构体类型的定义 2、结构体变量的初始化、结构体变量的初始化 3、结构体变量的引用、结构体变量的引用 4、结构体的输入输出、结构体的输入输出 重重 点点二、结构体类型变量二、结构体类型变量 一、结构体类型数据概述一、结构体类型数据概述 2022-11-1123一、
16、结构体数组的定义一、结构体数组的定义 二、结构体数组的初始化二、结构体数组的初始化三、结构体数组的引用三、结构体数组的引用四、输入数据时容易出现的问题四、输入数据时容易出现的问题7.3 结构体数组结构体数组 7.4 结构体与函数结构体与函数 一、结构体变量作为函数参数一、结构体变量作为函数参数 二、结构体类型函数二、结构体类型函数2022-11-1124一、结构体数组的定义一、结构体数组的定义 struct studentchar name20;char sex;int age;float score;;struct student stud50;单独定义单独定义 同同时时定定义义 struc
17、t time int hour;int minute;int second;t120,t240;struct int month;int day;int year;date30;直直接接定定义义 2022-11-1125二、结构体数组的初始化二、结构体数组的初始化 struct date_of_birthint year;int month;int day;struct date_of_birth birthday50=1979,3,12,1978,8,23,1980,4,8;为数组为数组birthday的前的前3个元素赋个元素赋了初值,其余元素未赋初值,了初值,其余元素未赋初值,系统将系统将
18、数值型成员赋以数值型成员赋以0,对,对字符型数据赋以字符型数据赋以0。即在定义数组时提供初值。即在定义数组时提供初值。2022-11-1126若初始化时提供的数据组的个数与数组若初始化时提供的数据组的个数与数组的元素个数相同,则元素个数可省略。的元素个数相同,则元素个数可省略。教材教材P255下例下例 2022-11-11271、引用某元素的一个成员例如 接上例birthday3.year=birthday0.year;birthday3.month=birthday1.month;birthday3.day=birthday2.day;三、结构体数组的引用三、结构体数组的引用 遵从一般数组和
19、结构体变量的规定。遵从一般数组和结构体变量的规定。2022-11-11282、引用某一个元素、引用某一个元素这时一般用于赋值,与结构体变量用法类似。这时一般用于赋值,与结构体变量用法类似。struct date_of_birth d;d=birthday0;birthday0=birthday2;birthday2=d;例如例如 接上例接上例2022-11-1129四、输入数据时容易出现的问题四、输入数据时容易出现的问题#include“stdio.h”main()structchar name20;int age;char sex;stud;scanf(“%s,%d,%c”,stud.nam
20、e,&stud.age,&stud.sex);printf(“%sn%dn%cn”,stud.name,stud.age,stud.sex);若输入:若输入:zhang san,20,m 若输入:若输入:zhangsan,20,m2022-11-1130 可将输入改为:可将输入改为:gets(stud.name);scanf(“%d,%c”,&stud.age,&stud.sex);这时输入:这时输入:zhangsan 20,m 结果正确:结果正确:zhangsan 20 m2022-11-1131 但若将输入改为:但若将输入改为:gets(stud.name);scanf(“%d”,&stu
21、d.age);scanf(“%c”,&stud.sex);则输入:则输入:zhangsan 20 若再改为:若再改为:gets(stud.name);scanf(“%d”,&stud.age);stud.sex=getchar();为了吸收前一个输入中的为了吸收前一个输入中的回车符对后一个输入的影回车符对后一个输入的影响,通常增加一个语句。响,通常增加一个语句。gets(stud.name);scanf(“%d”,&stud.age);getchar();stud.sex=getchar();则正确。则正确。还未及输入还未及输入m,程序已运行,程序已运行,且且stud.sex得到的是换行符。得
22、到的是换行符。2022-11-1132综上所述,为了避免不同类型引起的混乱,可以将综上所述,为了避免不同类型引起的混乱,可以将各种类型的数据都用各种类型的数据都用gets函数函数输入(单个字符则用输入(单个字符则用getchar函数函数),然后利用),然后利用C的库函数将数据转换成的库函数将数据转换成原来的类型。原来的类型。转换函数有:(须包含头文件转换函数有:(须包含头文件“stdlib.h”)atoi(字符串)(字符串)转换为整型转换为整型atof(字符串)(字符串)转换为实型转换为实型atol(字符串)(字符串)转换为长整型转换为长整型2022-11-1133 7.4 结构体与函数结构体
23、与函数 一、结构体变量作为函数参数一、结构体变量作为函数参数可同时将各个成员的值传递到其它函数。可同时将各个成员的值传递到其它函数。例例2022-11-1134struct time int hour;int minute;int second;main()void time_output(struct time t);struct time tim;scanf(“%d,%d,%d”,&tim.hour,&tim.minute,&tim.second);time_output(tim);void time_output(struct time t)char*p;if(t.hour12)t.ho
24、ur-=12;p=”pm”;elsep=”am”;printf(“It is%d:%d:%d%sn”,t.hour,t.minute,t.second,p);2022-11-1135利用结构体变量作函数参数是利用结构体变量作函数参数是传值方式传值方式,对形参,对形参的操作不影响实参的值。的操作不影响实参的值。结构体类型定义在函数外,但并未定义变量,所结构体类型定义在函数外,但并未定义变量,所有变量都在各函数体内,故属于局部变量。有变量都在各函数体内,故属于局部变量。2022-11-1136二、结构体类型函数二、结构体类型函数函数的类型就是其返回值的类型,若函数返回一函数的类型就是其返回值的类型
25、,若函数返回一个个结构体类型的值结构体类型的值(其中包含若干个成员),这(其中包含若干个成员),这样的函数就是结构体类型的。样的函数就是结构体类型的。将上例中的输入部分设计成结构体类型函数。将上例中的输入部分设计成结构体类型函数。2022-11-1137struct time int hour;int minute;int second;main()struct time time_input(void);void time_output(struct time t);struct time new_time;new_time=time_input();time_output(new_time
26、);void time_output(struct time t)char*p;if(t.hour12)t.hour-=12;p=”pm”;else p=”am”;printf(“It is%d:%d:%d%sn”,t.hour,t.minute,t.second,p);struct time time_input(void)struct time tt;scanf(“%d,%d,%d”,&tt.hour,&tt.minute,&tt.second);return(tt);2022-11-11387.5 结构体与指针结构体与指针 一一、结构体指针、结构体指针struct studentchar
27、 name20;char sex;int age;float score;struct student stud,*p;p=&stud;指向结构体变量,不能指向其他类型的数据。指向结构体变量,不能指向其他类型的数据。2022-11-1139通过结构体指针访问结构体成员有两种方法:通过结构体指针访问结构体成员有两种方法:strcpy(p-name,“zhangsan”);(*p).sex=m;stud.age=20;p-score=95.5;printf(“%s,%c,%d,%6.2fn”,(*p).name,stud.sex,p-age,p-score);printf(“%x,%xn”,p,p
28、+1);(*指针变量指针变量).成员名成员名称为显式方式称为显式方式指针变量成员名指针变量成员名称为专用方式称为专用方式例如例如 接上定义:接上定义:将上述程序作为主函数,将上述程序作为主函数,运行后显示运行后显示:zhangsan,m,20,95.50ffc2,ffdd 2022-11-11402022-11-1141for(i=0;iname);for(p=freshmen;pname);表示输入表示输入50名名新生的姓名新生的姓名 表示输出表示输出50名新生的姓名新生的姓名名 struct student freshmen50,*p;p=freshmen;或写为或写为 p=&freshm
29、en0;二、指向结构体数组的指针二、指向结构体数组的指针 例如例如 对于上述结构体类型,有以下定义对于上述结构体类型,有以下定义 或写为 gets(*p).name);gets(freshmeni.name);2022-11-1142三、用结构体指针作为函数参数三、用结构体指针作为函数参数 只需传递一个地址。只需传递一个地址。且函数中的结构体成员且函数中的结构体成员并不占据新的内存单元,而与主调函数中的并不占据新的内存单元,而与主调函数中的成员共享存储单元。成员共享存储单元。还可通过修改形参所指成员影响实参所对应的还可通过修改形参所指成员影响实参所对应的成员值。成员值。2022-11-1143
30、struct book char bookname30;int quantity;main()void fun(struct book*p);struct book book1=“Programming in C”,10;fun(&book1);printf(“%d copiesn”,book1.quantity);void fun(struct book*p)printf(“The book”%s”has“,p-bookname);p-quantity-=3;显示:显示:The book“Programming in C”has 7 copies 2022-11-1144此外,还可将此外,还
31、可将结构体数组结构体数组作为函数参数;还作为函数参数;还可设计可设计结构体指针型函数结构体指针型函数,即返回的地址是,即返回的地址是指向结构体类型数据的。指向结构体类型数据的。2022-11-11457.6 动态存储分配与链表动态存储分配与链表 一、基本概念一、基本概念 1、内存单元的分配、内存单元的分配静态存储分配静态存储分配动态存储分配动态存储分配2022-11-1146此外,链表中设一个此外,链表中设一个头指针头指针变量,它指向第变量,它指向第一个结点,并且末结点(又称为表尾)的指一个结点,并且末结点(又称为表尾)的指针部分存放的是针部分存放的是“空地址空地址”NULL,表示它不,表示它
32、不指向任何结点,链表到此结束。指向任何结点,链表到此结束。2、链表链表链表由链表由若干结点若干结点构成,每一个结点含有两部分构成,每一个结点含有两部分内容:内容:数据部分数据部分和和指针部分指针部分。数据部分是程序。数据部分是程序所需的,指针部分则存放所需的,指针部分则存放下一个结点的地址下一个结点的地址。教材教材P256图图7.152022-11-11473、链表的插入、链表的插入链表中结点的插入如链表中结点的插入如P256下图下图7.164、链表的删除、链表的删除链表中结点的删除如链表中结点的删除如P257下图下图7.172022-11-1148二、链表的建立二、链表的建立 1、定义结点的
33、组成、定义结点的组成利用包含指针成员的结构体变量构成结点利用包含指针成员的结构体变量构成结点。struct stud_scorelong num;float score;struct stud_score*next;2022-11-11492、定义结点、定义结点 struct stud_score stud1,stud2,stud3;stud1.num=98101;stud1.score=89.5;stud2.num=98102;stud2.score=90.5;stud3.num=98103;stud3.score=94.5;根据以上结点的组成,可定义结点实体,并输根据以上结点的组成,可定义
34、结点实体,并输入数据。入数据。2022-11-11503、建立链表、建立链表 struct stud_score*head;head=&stud1;stud1.next=&stud2;stud2.next=&stud3;stud3.next=NULL;将各个结点链接起来便构成一个链表。将各个结点链接起来便构成一个链表。教材教材P258图图7.192022-11-11514、输出链表(访问链表)、输出链表(访问链表)第一个结点的学号和成绩可表示为:第一个结点的学号和成绩可表示为:head-num,head-score 通过上一个结点的指针项访问下一个结点。通过上一个结点的指针项访问下一个结点。第
35、二个结点的学号和成绩可表示为:第二个结点的学号和成绩可表示为:stud1.next-num,stud1.next-score 或或head-next-num,head-next-score 第三个结点的学号和成绩可表示为:第三个结点的学号和成绩可表示为:head-next-next-num,head-next-next-score 2022-11-1152三、动态存储分配函数三、动态存储分配函数 1、malloc函数:开辟指定大小的存储空间,并函数:开辟指定大小的存储空间,并返回该存储区的起始地址。返回该存储区的起始地址。函数原型为函数原型为void*malloc(unsigned int s
36、ize)使用时应包含头文件使用时应包含头文件“alloc.h”或或“malloc.h”或或“stdlib.h”2022-11-1153例如float*p1;int*p2;p1=(float*)malloc(8);*p1=3.14;*(p1+1)=-3.14;p2=(int*)malloc(20*sizeof(int);for(i=0;iname);scanf(“%d”,&new-age);getchar();new-next=NULL;head=new;while(flag)printf(“New student to add in?(Y/N)”);c=getchar();getchar();
37、if(c=y|c=Y)new_one();else out_put();flag=0;定义第定义第一个结一个结点,并点,并输入内输入内容容头指针指向头指针指向第一个结点第一个结点 2022-11-1160void new_one(void)new=(struct student*)malloc(sizeof(struct student);gets(new-name);scanf(“%d”,&new-age);getchar();new-next=NULL;this=head;while(this-next!=NULL)this=this-next;this-next=new;新结点指针指向空
38、,表示末结点(链尾)新结点指针指向空,表示末结点(链尾)原来的末结点指向新结点原来的末结点指向新结点void out_put(void)this=head;do printf(“Student%s,age is%dn”,this-name,this-age);this=this-next;while(this!=NULL);定义第定义第一个结一个结点,并点,并输入内输入内容容从第一个结点起搜索原链表中从第一个结点起搜索原链表中的末结点的末结点2022-11-1161单向单向链表:最简单的链表。链表:最简单的链表。单向链表不能逆向访问结点。单向链表不能逆向访问结点。双向双向链表:每一个结点均含有
39、两个指针项,分链表:每一个结点均含有两个指针项,分别指向上一结点和下一结点。别指向上一结点和下一结点。环形环形链表:链尾指向链头形成环路。链表:链尾指向链头形成环路。2022-11-1162环形链表环形链表简例:简例:编号为编号为1n的的n个人围成一圈,以第一个人为起个人围成一圈,以第一个人为起点从点从1到到3报数,每数到报数,每数到3则退出圆圈。问最后留下则退出圆圈。问最后留下的人其编号是几?的人其编号是几?2022-11-1163#include alloc.hmain()struct person int position;struct person*next;*head,*new,*t
40、his;int i,n;printf(“How many people?”);scanf(“%d”,&n);this=(struct person*)malloc(sizeof(struct person);this-position=1;head=this定义第一个结点,并使头指针指向它定义第一个结点,并使头指针指向它定义其余定义其余n-1个结点,并形成链表个结点,并形成链表for(i=2;iposition=i;this-next=new;this=new;this-next=head;链尾指向链头链尾指向链头2022-11-1164从第一个结点开始,依条件陆续删除结点,直至最后一个结点从
41、第一个结点开始,依条件陆续删除结点,直至最后一个结点this=head;while(this-next!=this)for(i=1;inext;new-next=this-next;this=this-next;printf(The people left is No.%dn,this-position);while循环也可写为:循环也可写为:for(k=1;ka);p-b=4.5;printf(“%fn”,x.b);2022-11-11682引用共用体变量引用共用体变量共用体变量作为整体使用一般限于共用体变量作为整体使用一般限于赋值赋值,或作为函数参数,但这时传递的仍或作为函数参数,但这时传
42、递的仍只有一只有一个成员的值个成员的值。例如例如P267例例7.142022-11-1169三、共用体变量的应用 1、在同一个字段中存储不同类型的数据在同一个字段中存储不同类型的数据例如例如P268例例7.152、实现数据类型的转换实现数据类型的转换例如例如P268例例7.162022-11-11707.8 枚举类型数据 一、一、枚举枚举的概念的概念枚举是离散的有限数据的集合。枚举是离散的有限数据的集合。变量的取值仅限于列举出的若干数据之一。变量的取值仅限于列举出的若干数据之一。二、枚举变量的定义二、枚举变量的定义单独定义、同时定义、直接定义。单独定义、同时定义、直接定义。2022-11-11
43、71例如例如enum esexmale,female sex;enum esex为定义的枚举类型为定义的枚举类型 枚举关键字枚举关键字 枚举名枚举名 枚举常量或枚举元素枚举常量或枚举元素 2022-11-1172上例可写为上例可写为enum male,female sex;(直接定义直接定义)或或enum esex male,female;(单独定义单独定义)enum esex sex;2022-11-1173三、说明三、说明枚举元素若没有初始化,则取值依次为枚举元素若没有初始化,则取值依次为0,1,2,。例如例如enum dayssun,mon,tues,wed,thur,fri,sat;2
44、022-11-1174初始化枚举元素举例:初始化枚举元素举例:enum coinspenny=1,nickel=5,dime=10,quarter=25;enum color_namered=3,yellow,blue,white=2,black;enum dayssat,sun=0,mon,tues,wed,thur,fri;enum signminus=-1,null,zero=0,plus;2022-11-11757.9 用typedef定义新的类型名 C语言允许利用语言允许利用typedef来重新给类型命名,以达来重新给类型命名,以达到简化程序便于阅读的目的。到简化程序便于阅读的目的。
45、步骤如下:步骤如下:1、按常规方法写出类型定义,、按常规方法写出类型定义,如如int x;float a10;2022-11-11762、将标识符用新的类型名改写将标识符用新的类型名改写,如如int INTEGER;float ARRAY10;3、在前面加上关键字在前面加上关键字typedef,如,如typedef int INTEGER;typedef float ARRAY10;2022-11-11774、然后可在程序中用新类型名定义数据然后可在程序中用新类型名定义数据,如:,如:INTEGER m,n;等价于等价于 int m,n;ARRAY c,d;等价于等价于 float c10,d10;2022-11-1178例如typedef int COUNT20;typedef float*POINTER;COUNT a,b5;等价于等价于 int a20,b520;POINTER p1,p2,p10;等价于等价于 float*p1,*p2,*p10;2022-11-1179例如typedef structchar name20;float score;STUDENT;STUDENT stud1,stud2,*st;2022-11-1180