《第10章结构体与共用体》由会员分享,可在线阅读,更多相关《第10章结构体与共用体(56页珍藏版)》请在金锄头文库上搜索。
1、第第10章章 结构体与共用体结构体与共用体概述概述结构体结构体共用体共用体枚举类型枚举类型2结构简介结构简介存储一个班级中 5 名学员的信息(学号、姓名、性别和成绩)问题:I. 使用数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564解决方案:scorenumsexname不能建立数组间的关系II. 使用多维数组MaryJohnPeterRoseKateFMFMF01020304058978.56797.564C 语言不允许一个数组包含多种数据类型III. 使用结构numnamesexscoreC 语言引入了称为结构的数据存储方式“结构” 是
2、一种构造数据类型,它是由若干数据项组合而成的复杂数据对象,这些数据项称为结构的成员。10.1 概述概述%结结构构体体(structurestructure)是是用用户户自自定定义义的的一一种种数数据据类类型型,包含若干个类型不同的数据项。,包含若干个类型不同的数据项。%用用途途:把把不不同同类类型型的的数数据据组组合合成成一一个个整整体体。而而分分别别用独立变量来表示不能反映它们之间的内在联系。用独立变量来表示不能反映它们之间的内在联系。例:定义一个结构体类型例:定义一个结构体类型studentstudent,包包含学号、姓名、性别、年龄、成绩、含学号、姓名、性别、年龄、成绩、家庭地址。家庭地
3、址。10.1 概述概述%结构体类型的定义结构体类型的定义structstruct 结构体名结构体名 类型标识符类型标识符 成员名成员名1 1; 类型标识符类型标识符 成员名成员名2 2; ;struct是是关键字关键字,不能省略不能省略合法标识符合法标识符可省略:无名结构体可省略:无名结构体成员类型可以是基本成员类型可以是基本类型或构造类型类型或构造类型必须有分号必须有分号5定义结构定义结构structstructurenamedatatypevariable1;datatypevariable2;.;结构成员;结构名structstudentintnum;charname20;charsex
4、;定义结构floatscore;C语言中的有效数据类型6定义结构定义结构structstudentintnum;charname20;charsex;floatscore;numnamesexstudent结构定义并不预留内存结构定义放置在程序的开始部分,位于头文件声明之后 score结构定义仅描述了一个结构的形式。如果要在程序里使用结构,需要声明结构变量。structdateintyear;intmonth;intday;structstd_info intnum;charname20;charsex;floatscore;charaddr30;structdatebirthday;日期结构
5、体类型日期结构体类型:由年、:由年、月、日三项组成月、日三项组成学生信息结构类型学生信息结构类型:由学:由学号、姓名、性别、成绩、号、姓名、性别、成绩、地址和生日共地址和生日共6 6项组成项组成可以改写成可以改写成intyear,mongth,day;10.1.1结构体变量的定义结构体变量的定义&间接定义法间接定义法:先先定义结构体定义结构体类型类型,后后定义结构体定义结构体变量变量structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;structstudentstu1,stu2;&直接定义法直接定义法:在在定定
6、义义结结构构类类型型的的同同时时,定义结构变量定义结构变量structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;结构体类型名结构体类型名student可以不写可以不写structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;stu1:num name sex age score addr22012430stu1stu1在内存中共占字节数:在内存中共占字节数:2+20+1+2+4+30=592+20
7、+1+2+4+30=5910.1.3 结构体变量的引用结构体变量的引用结构体变量的引用原则结构体变量不能整体输入输出,要通过成员运算结构体变量不能整体输入输出,要通过成员运算符符“. .”,逐个逐个访问其成员,且访问的格式为:访问其成员,且访问的格式为: 结构体变量结构体变量. .成员成员 structdateintyear;intmonth;intday;structdatebirth;printf(%d,%d,%dprintf(%d,%d,%d,birthbirth) );printf(%d,%d,%dprintf(%d,%d,%d,birth.yearbirth.year, ,birth
8、.month,birth.daybirth.month,birth.day) ); “. .”是成员运算符,是成员运算符,优先级最高优先级最高如果某成员本身又是一个结构类型,则只能通过多级的分量运如果某成员本身又是一个结构类型,则只能通过多级的分量运算,对最低一级的成员进行引用。算,对最低一级的成员进行引用。 结构变量结构变量. .成员成员. .子成员子成员. . .最低级子成员最低级子成员引用结构变量引用结构变量studentstudent中的中的birthdaybirthday成员的格式分别为:成员的格式分别为:student.birthday.yearstudent.birthday.y
9、earstudent.birthday.monthstudent.birthday.monthstudent.birthday.daystudent.birthday.day结构体变量的引用原则structstd_info intnum;charname20;charsex;floatscore;structdatebirthday;student;structdateintyear;intmonth;intday;num name sex score birthdaystudent:对最低一级成员,可像同类型的普通变量一样,进行对最低一级成员,可像同类型的普通变量一样,进行相应的各种运算。相
10、应的各种运算。结构体变量的初始化结构体变量的初始化8一般形式一般形式 结构体类型名结构体类型名 结构体变量结构体变量=初值表初值表 ;8说明说明若某成员本身又是结构体类型,则该成员的初值为一个初值表若某成员本身又是结构体类型,则该成员的初值为一个初值表初值的数据类型,应与结构变量中相应成员的类型一致初值的数据类型,应与结构变量中相应成员的类型一致structstd_info intnum;charname20;charsex;floatscore;structdatebirthday;;structstd_infostudent=102,ZhangsanZhangsan,M,85,1980,9
11、,20;struct student int num; char name20; char sex; float score;struct student student1,student2;内存student1struct student student1=1,Yao Ming ,M,90.5; 1Yao MingM赋值的顺序应与成员声明时的顺序一样;允许初始化语句中的值的数目比结构成员数目少。student1.numstudent1.namestudent1.sex90.5student1.score结构变量初始化结构变量初始化student2student2.num=1;student2
12、.name=Zhang Zi Liang;student2.sex=M;printf(请输入成绩:请输入成绩:n);scanf(%f,&student2.score);结构变量赋值结构变量赋值1Zhang Zi Liang Mq用输入语句或赋值语句来给结构变量的各个成员赋值7878student3 = student2; student31Zhang Zi Liang M78问题描述:根据学员的成绩,输出不及格学员的详细信息。 使用结构示例使用结构示例#includestruct studentint num;/学号char *name;/姓名char sex;/性别float score;/
13、成绩;void main() static struct student stu1=1,李亚鹏,M,61; static struct student stu2=2,周晶晶,F,92.5; static struct student stu3=3,姚光明,M,59; printf(不及格学员的名单如下:n); if(stu1.score60) printf(%dt%st%ct%5.2fn,stu1.num,stu1.name,stu1.sex,stu1.score); if(stu2.score60) printf(%dt%st%ct%5.2fn,stu2.num,stu2.name,stu2
14、.sex,stu2.score); if(stu3.score=60 & stu2.score=60 & stu3.score=60) printf(没有不及格的学员。n);不及格学员的名单如下:3 姚光明 M 59.00stu11李亚鹏M78stu22周晶晶F92stu33姚光明M59structstd_info intnum;charname20;charsex;structdatebirthday;;main()structstd_infostu=102,ZhangsanZhangsan,M,1980,9,20;printf(Num:%dn,stu.num);printf(Name:%s
15、n,stu.name);printf(Sex:%cn,stu.sex);printf(Birthday:%d-%d-%dn,stu.birthday.year,stu.birthday.month,stu.birthday.day); 例例 定义一个结构变量定义一个结构变量stustu,用于存储和显示一个学生的基本用于存储和显示一个学生的基本 情况。情况。structstd_infostu;scanf(%d%s%c%d%d%d,&stu.num,stu.name,&stu.sex,&stu.birthday.year,&stu.birthday.month,&stu.birthday.day)
16、;10.2结构体数组结构体数组O定义:定义:结构数组的每一个元素,都是结构类型数据,均结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。包含结构类型的所有成员。structstudentintnum;charname20;charsex;intage;floatscore;;structstudentstu3;101LilinM 1887.5102ZhanghuaM 1899103WuliF1978.5stu0stu1stu2O结构体数组初始化:结构体数组初始化:结构体类型名结构体类型名 结构体数组名结构体数组名 nn 初值表初值表1 1 , 初值表初值表2 2 , . .,
17、初值表初值表n n ; structstudentintnum;charname20;charsex;intage;floatscore;;structstudentstu3101,Lilin,M,18,87.5,102,Zhanghua,M,18,99,103,Wuli,F,19,78.5; 例例 定义结构类型定义结构类型structstruct std_infostd_info,定义一个结构数组定义一个结构数组stustu,用于存储和显示三个学生的基本情况。用于存储和显示三个学生的基本情况。structdateintyear;intmonth;intday;structstd_infoin
18、tnum;charname20;charsex;structdatebirthday;stu3=102,Zhangsan,M,1980,9,20,105,Lisi,M,1980,8,15,112,Wangwu,F,1980,3,10;main()inti;printf(No.NameSexBirthdayn);for(i=0;i3;i+)printf(%-7d,stui.num);printf(%-9s,stui.name);printf(%-4c,stui.sex);printf(%d-%d-%dn,stui.birthday.year,stui.birthday.month,stui.bi
19、rthday.day);程序运行结果:程序运行结果:No. Name Sex BirthdayNo. Name Sex Birthday102 102 ZhangsanZhangsan M M 1980-9-20 1980-9-20105 105 LisiLisi M 1980-8-15 M 1980-8-15112 112 WangwuWangwu F F 1980-3-10 1980-3-10统计后选人选票统计后选人选票structpersoncharname20;intcount;leader3=“Lian”,0,“ABian”,0,”Song“,0;main()inti,j;charl
20、eader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;for(i=0;inum=101;strcpy(p-name,lilin);引用结构体变量成员的三种形式:引用结构体变量成员的三种形式:结构体变量结构体变量.成员名成员名stu.num(*p).成员名成员名(*p).nump-成员名成员名p-num若若structstudentstu;structstudent*p=&stu;则则结构体成员运算符结构体成员运算符
21、 . . 和和 - 的比较:的比较:二者的优先级相同,自左向右结合二者的优先级相同,自左向右结合运算符运算符 . . 前面只能是前面只能是结构体变量名结构体变量名或或(*(*p)p)运算符运算符 - 前面只能是前面只能是指向结构体的指针变量指向结构体的指针变量名名,不能是其它变量名,不能是其它变量名 stustu-num-num 分析下列表达式:分析下列表达式:p-nump-nump-num+p-num+p-num+p-num设有以下语句:设有以下语句:structstintn;structst*next;staticstructsta3=5,&a1,7,&a2,9,0,*p;p=&a0;则表
22、达式则表达式()的值是的值是6。A.p+-nB.p-n+C.(*p).n+D.+p-nD指向结构体数组的指针指向结构体数组的指针structstudentintnum;charname20;charsex;intage;;structstudentstu3101,Lilin,M,18,102,Zhanghua,M,18,103,Wuli,F,19,;structstudent*p=stu;main()for(;pnum,p-name,p-sex);说明:说明:如果指针变量如果指针变量p p指向结构体数组,指向结构体数组,则则p+1p+1指向结构体数组的下一个指向结构体数组的下一个元素,而不是当
23、前元素的下一个元素,而不是当前元素的下一个成员。成员。如果指针变量如果指针变量p p指向一个结构变指向一个结构变量(或结构数组),就不能再使量(或结构数组),就不能再使之指向结构体变量(或结构数组之指向结构体变量(或结构数组元素)的某一成员元素)的某一成员。p=stu;p=stu.name;(+p)-num(p+)-num numnamesexagestu0pstu1stu2p+1下面程序的输出结果为( )。struct st int x; int *y; *p;int dt4=10,20,30,40;struct st aa4=50,&dt0,60,&dt1,70,&dt2,80,&dt3;
24、main() p=aa;printf(%dn,+p-x);printf(%dn,(+p)-x);printf(%dn,+(*p-y);A.10 B.50 C. 51 D.60 20 60 60 70 20 21 21 31 10203040dt50607080aaxy&dt0&dt1&dt2&dat3pp+用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数用结构体类型数据作为函数参数有以下三种形式:用结构体类型数据作为函数参数有以下三种形式:Q用结构体变量的用结构体变量的成员成员作参数作参数用法与普通变量作参数相同,值传递用法与普通变量作参数相同,值传递Q用用结构
25、体变量结构体变量作参数作参数函数的实参和形参必须都是结构体变量,程序效率函数的实参和形参必须都是结构体变量,程序效率低,不主张用低,不主张用Q用指向结构体变量的指针作参数用指向结构体变量的指针作参数提高运行效率提高运行效率10.4 用指针处理链表用指针处理链表一、一、链表结构链表结构链表的三要素:链表的三要素:头指针变量头指针变量head指向链表的首结点指向链表的首结点(链表中每一个元素称为一个链表中每一个元素称为一个结点结点)每个结点由每个结点由2个个域域组成:组成:数据域数据域-存储结点本身的信息存储结点本身的信息指针域指针域-存储后继结点的指针(地址)存储后继结点的指针(地址)尾结点的指
26、针域为尾结点的指针域为NULL(空),空),作为链表结束的标志作为链表结束的标志Head1249A1356B1475C1021DNULL124913561475102110.5 共用体共用体概念:概念: 使几个使几个不同不同的变量占有的变量占有同一段同一段内存空间的结构称为共用体内存空间的结构称为共用体共用体共用体类型类型的定义的定义 -与结构体类型的定义类似与结构体类型的定义类似unionunion 共用共用体类型名体类型名 类型标识符类型标识符 成员名成员名1 1; 类型标识符类型标识符 成员名成员名2 2; ;union category int class; char position
27、10;共用体共用体变量变量的定义的定义-与结构体变量的定义类似与结构体变量的定义类似&间接定义法间接定义法:先先定义共用体定义共用体类型类型,后后定义共用体定义共用体变量变量uniondatainti;charch;floatf;uniondataun1,un2,un3;&直接定义法直接定义法:在在定定义义共共用用体体类类型型的的同同时时,定义共用体变量定义共用体变量uniondatainti;charch;floatf;un1,un2,un3;uniondatainti;charch;floatf;uniondataun1,un2,un3;ch注意注意:共用变量占用的内存空间,等于:共用变量
28、占用的内存空间,等于最长最长成员的长度,而不是各成员长度之和。成员的长度,而不是各成员长度之和。if2000 2001 2002 2003un1:un1占用的内存空间为字节(不是占用的内存空间为字节(不是2+1+4=7字节)。字节)。共用体共用体变量变量的引用的引用与结构体变量的引用一样,也只能与结构体变量的引用一样,也只能逐个逐个引用共用体变量的成员引用共用体变量的成员un11;ma;un1.i=1;mun1.i;特点特点(1 1)系系统统采采用用覆覆盖盖技技术术,实实现现共共用用变变量量各各成成员员的的内内存存共共享享,所所以以在在某某一一时时刻,最后一次存入的成员值是起作用的。刻,最后一
29、次存入的成员值是起作用的。例如,执行例如,执行un1.i=1; un1.ch=c; un1.f=3.14un1.i=1; un1.ch=c; un1.f=3.14后,后,un1.fun1.f才是有效的成员才是有效的成员。(2 2)由于所有成员共享同一内存空间,故共用变量与其各成员的)由于所有成员共享同一内存空间,故共用变量与其各成员的地址地址相同。相同。例如,例如,un1=un1=un1.i=un1.i=un1.ch=un1.ch=un1.fun1.f。(3 3)不不能能对对共共用用体体变变量量进进行行初初始始化化(注注意意:结结构构体体变变量量可可以以);也也不不能能将将共共用用变变量量作作
30、为为函函数数参参数数,以以及及使使函函数数返返回回一一个个共共用用体体数数据据,但但可可以以使使用用指指向向共用变量的指针。共用变量的指针。(4 4)共用类型可以出现在结构类型定义中,反之亦然。)共用类型可以出现在结构类型定义中,反之亦然。结构体与共用体l区别: 存储方式不同struct node char ch2; int k;a;union node char ch2; int k;b;achkbch k变量的各成员同时存在任一时刻只有一个成员存在l联系联系: 两者可相互嵌套两者可相互嵌套下面定义中sizeof(a)和sizeof(a.share)的值是?struct date int d
31、ay; int month; int year; union int share1; float share2; share; a; 例sizeof(a)=10sizeof(a.share)=4 下面定义中变量w在内存中所占字节数?union aa float x,y; char c6;struct st union aa v; float w5; double ave; w; 例 sizeof(w)=34 下列程序输出结果是( )。#include main()unionint k; char i2; *s,a; s=&a; s-i0=0x39; s-i1=0x38; printf(%xn,
32、s-k); A.3839 B.3938 C.380039 D.390038例a.ka.i0a.i1共用体变量a或s-k或s-i0或s-i1在内存中存储形式为0011 1001 下列程序输出结果是( )。#include main()unionint k; char i2; *s,a; s=&a; s-i0=0x39; s-i1=0x38; printf(%xn,s-k); A.3839 B.3938 C.380039 D.390038例共用体变量as-ks-i0s-i10011 10010011 1000在内存中存储形式为 下列程序输出结果是( )。#include main()unionin
33、t k; char i2; *s,a; s=&a; s-i0=0x39; s-i1=0x38; printf(%xn,s-k); A.3839 B.3938 C.380039 D.390038例共用体变量a0011 10010011 1000低字节高字节故s-k在内存中存储数据为:0011 1000 0011 1001s-ks-i0s-i1若有以下的说明、定义和语句,则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 0001若有以下的说明、定义和语句,
34、则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001若有以下的说明、定义和语句,则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001若有以下的说明、定义和语句,则输出结果为_。main() unio
35、n un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001以八进制形式输出,二进制向以八进制形式输出,二进制向八进制八进制转换原则转换原则是:三位二进是:三位二进制对应一位八进制制对应一位八进制1若有以下的说明、定义和语句,则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0
36、100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001以八进制形式输出,二进制向以八进制形式输出,二进制向八进制八进制转换原则转换原则是:三位二进是:三位二进制对应一位八进制制对应一位八进制10若有以下的说明、定义和语句,则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001以八进制形式输出,二进制向以八进制形式输出,二
37、进制向八进制八进制转换原则转换原则是:三位二进是:三位二进制对应一位八进制制对应一位八进制105若有以下的说明、定义和语句,则输出结果为_。main() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001以八进制形式输出,二进制向以八进制形式输出,二进制向八进制八进制转换原则转换原则是:三位二进是:三位二进制对应一位八进制制对应一位八进制1050若有以下的说明、定义和语句,则输出结果为_。m
38、ain() union un int a; char c2; w; w.c0=A;w.c1=a; printf(%on,w.a);例w.aw.c0w.c1共用体变量w0100 00010110 0001故w.a在内存中存储数据为:0110 0001 0100 0001以八进制形式输出,二进制向以八进制形式输出,二进制向八进制八进制转换原则转换原则是:三位二进是:三位二进制对应一位八进制制对应一位八进制10506运行结果: 60501以下程序运行的输出结果是以下程序运行的输出结果是()。main()unionchari2;intk;r;r.i0=2;r.i1=0;printf(%dn,r.k);
39、A.2B.1C.0D.不确定不确定A例e.ine.a 或e.b共用体变量ee.in.xe.in.y程序运行的结果是程序运行的结果是_。main()unionEXAMPLEstructintx;inty;in;inta;intb;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(%d,%dn,e.in.x,e.in.y);程序运行的结果是程序运行的结果是_。main()unionEXAMPLEstructintx;inty;in;inta;intb;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;prin
40、tf(%d,%dn,e.in.x,e.in.y);e.ine.a或e.b共用体变量e1e.in.xe.in.y例程序运行的结果是程序运行的结果是_。main()unionEXAMPLEstructintx;inty;in;inta;intb;e;e.a=1;e.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(%d,%dn,e.in.x,e.in.y);e.ine.a或e.b共用体变量e1e.in.xe.in.y2例程序运行的结果是程序运行的结果是_。main()unionEXAMPLEstructintx;inty;in;inta;intb;e;e.a=1;e
41、.b=2;e.in.x=e.a*e.b;e.in.y=e.a+e.b;printf(%d,%dn,e.in.x,e.in.y);e.ine.a或e.b共用体变量e2e.in.xe.in.y4例10.6 枚举类型枚举类型用途:用途: 如果一个变量只有几种可能的值,就可以定义成枚举类型如果一个变量只有几种可能的值,就可以定义成枚举类型枚举枚举类型类型的定义的定义 enum 枚举类型名取值表枚举类型名取值表; 例:例:enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat;枚举枚举变量变量的定义的定义-与结构体变量定义类似与结构体变量定义类似间接定义:间接定义:enum
42、weekdays work; 直接定义:直接定义:enum weekdays Sun,Mon,Tue,Wed,Thu,Fri,Sat work; 说明:说明:(1)枚举型仅适应于取值有限的数据。枚举型仅适应于取值有限的数据。例:例:1周天,年个月。周天,年个月。(2)取值表中的值称为枚举元素,其含义由程序解释。取值表中的值称为枚举元素,其含义由程序解释。例例:不不是是因因为为写写成成“Sun”就就自自动动代代表表“星星期期天天”。事事实实上上, 枚枚举举元素用什么表示都可以。元素用什么表示都可以。(3)枚枚举举元元素素按按常常量量处处理理,它它们们的的值值是是定定义义时时的的顺顺序序号号(从从
43、开开始始),所以枚举元素可以进行比较,比较规则是:序号大者为大!所以枚举元素可以进行比较,比较规则是:序号大者为大!例例:上上例例中中的的Sun的的值值为为0、Mon的的值值为为1、Sat的的值值为为6,所所以以MonSun,Sat最大。最大。(4)枚举元素的值也是可以人为改变的:在定义时由程序指定。枚举元素的值也是可以人为改变的:在定义时由程序指定。例例:如如果果enum weekdays Sun=, Mon ,Tue, Wed, Thu, Fri, Sat;则则Sun=,Mon=,从从Tue=2开始,依次增。开始,依次增。注意注意:不同的枚举元素不可以指定相同的值:不同的枚举元素不可以指定
44、相同的值(5)一个整数不能直接赋值给枚举变量一个整数不能直接赋值给枚举变量例:例:workday2;(;(非法,因为类型不同)非法,因为类型不同) 改写成:改写成:workday(enum weekday)2;下面程序的输出是下面程序的输出是()。main()enumteammy,your=4,his,her=his+10;printf(%d%d%d%dn,my,your,his,her);A.0123B.04010C.04515D.14515C下面程序的输出是下面程序的输出是 。main()enumemem1=3,em2=1,em3;char*aa=AA,BB,CC,DD;printf(%s
45、%s%sn,aaem1,aaem2,aaem3);DDBBCC10.10 用用typedef定义类型定义类型 作用:作用:用用typedeftypedef定义已有类型的别名。该别名与标准类定义已有类型的别名。该别名与标准类型名一样,可用来定义相应的变量。型名一样,可用来定义相应的变量。定义已有类型别名的方法定义已有类型别名的方法 (1)(1)按定义变量的方法,写出定义体;按定义变量的方法,写出定义体;(2)(2)将变量名换成别名;将变量名换成别名;(3)(3)在定义体最前面加上在定义体最前面加上typedeftypedef。 关键字关键字例例: :给实型给实型floatfloat定义定义1 1
46、个别名个别名REALREAL。(1)(1)按定义实型变量的方法,写出定义按定义实型变量的方法,写出定义体:体: float f;float f;(2)(2)将变量名换成别名:将变量名换成别名: float float REALREAL; ;(3)(3)在定义体最前面加上在定义体最前面加上typedeftypedef: typedeftypedef float float REALREAL; ; 例例:给给结结构构类类型型structstruct datedate定定义义1 1个个别别名名DATEDATE。structstruct date date intint year, month, da
47、y; year, month, day; ; ;(1)1)按按定定义义结结构构变变量量的的方方法法,写写出出定定义义体体:structstruct date date d; d;(2)2)将将变变量量名名换换成成别别名名: structstruct date date DATEDATE; ;(3 3)在定义体最前面加上在定义体最前面加上typedeftypedef: typedeftypedef structstruct date date DATEDATE; ; typedeftypedef intint * *ipoinipoin; ; ipoinipoin p; p; 说明说明(1 1)
48、用)用typedeftypedef只是给已有类型增加个别名,只是给已有类型增加个别名,并不能创造个新的类型。并不能创造个新的类型。(2 2)typedeftypedef与与# #definedefine有相似之处,但二者有相似之处,但二者是不同的:前者是由编译器在编译时处理的;是不同的:前者是由编译器在编译时处理的;后者是由编译预处理器在编译预处理时处理的,后者是由编译预处理器在编译预处理时处理的,而且只能作简单的字符串替换。而且只能作简单的字符串替换。 1.设有以下定义设有以下定义typedefunionlongi;intk5;charc;DATE;structdateintcat;DATE
49、cow;doubledog;too;DATEmax;则则语语句句printf(%d,sizeof(structdate)+sizeof(max)的的执执行行结果是结果是()。A.25B.30C.18D.82.下面程序的输出是下面程序的输出是()。typedefunionlongx2;inty4;charz8;MYTYPE;MYTYPEthem;main()printf(%dn,sizeof(them);A.32B.16C.8D.244.设有以下说明语句设有以下说明语句typedefstructintn;charch8;PER;则下面叙述中正确的是则下面叙述中正确的是A)PER是结构体变量名是结
50、构体变量名B)PER是结构体类型名是结构体类型名C)typedefstruct是结构体类型是结构体类型D)struct是结构体类型名是结构体类型名3.若若要要说说明明一一个个类类型型名名STP,使使得得定定义义语语句句STPs;等等价价于于char*s;,以下选项中正确的是以下选项中正确的是A)typedefSTPchar*s;B)typedef*charSTP;C)typedefSTP*char;D)typedefchar*STP;BCDBl若有以下说明和定义若有以下说明和定义 typedef int *INTEGER INTEGER p,*q; 以下叙述正确的是以下叙述正确的是_。 A) p是是int型变量型变量 B) p是基类型为是基类型为int的指针变量的指针变量 C) q是基类型为是基类型为int的指针变量的指针变量lD) 程序中可用程序中可用INTEGER代替代替int类型名类型名 B