版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、结构体、共用体与枚举结构体、共用体与枚举 92l了解结构体、共用体和枚举类型的特点了解结构体、共用体和枚举类型的特点l熟练掌握结构体类型、变量、数组、指针变量熟练掌握结构体类型、变量、数组、指针变量的定义、初始化和成员的引用方法的定义、初始化和成员的引用方法l掌握共用体和枚举类型、变量的定义和引用掌握共用体和枚举类型、变量的定义和引用l掌握用户自定义类型的定义和使用掌握用户自定义类型的定义和使用39.1 结构体结构体 l【问题】如何表示下面的数据?【问题】如何表示下面的数据?l王云平、王云平、18岁、男、学号岁、男、学号2019010001、l汉族、北京、手机号汉族、北京、手机号1390100
2、0001l可以定义以下变量来分别表示上面的数据:可以定义以下变量来分别表示上面的数据:lchar name10;int age;char sex3;char xh11;lchar nation20;char address20;char mobile20; l 由于必须类型相同才能构造成数组,显然以由于必须类型相同才能构造成数组,显然以前学习的数据类型都不能很好地解决问题前学习的数据类型都不能很好地解决问题 49.1.1 结构体类型的定义结构体类型的定义 l结构体类型的定义形式为:结构体类型的定义形式为:lstruct 类型名类型名l 成员说明表列成员说明表列 ;l例如:例如:lstruct
3、student /* 结构体类型名结构体类型名 */l char name10; /*结构体成员,以下都是结构体成员,以下都是*/l int age;l char sex3; l char xh11;l char nation20;l char address20;l char 20;l; 59.1.1 结构体类型的定义结构体类型的定义lstruct是结构体关键字,结构体类型定义中的每个成是结构体关键字,结构体类型定义中的每个成员项都有确定的类型和名称,称为结构体类型的员项都有确定的类型和名称,称为结构体类型的“域域”,每个域的定义后面要有,每个域的定义后面要有“;”号。号。l结构体类型由用户
4、定义,所以结构体类型不是固定结结构体类型由用户定义,所以结构体类型不是固定结构的类型,用户可以定义不同结构的结构体类型,也构的类型,用户可以定义不同结构的结构体类型,也可以定义相同结构的结构体类型,系统均认为是不同可以定义相同结构的结构体类型,系统均认为是不同的结构体类型,例如下面是两个不同的结构体类型,的结构体类型,例如下面是两个不同的结构体类型,虽然虽然aa和和bb的结构是一样的:的结构是一样的:lstruct aaint a;int b;char c;lstruct bbint a;int b;char c;69.1.2 结构体变量的定义和初始化结构体变量的定义和初始化 l定义结构体变量
5、的方法可以如下:定义结构体变量的方法可以如下:l用已定义的结构体类型名定义变量。例如:用已定义的结构体类型名定义变量。例如:lstruct student wang,zhang; l在定义结构体类型的同时定义结构体变量。例如:在定义结构体类型的同时定义结构体变量。例如:lstruct student /* 结构体类型名结构体类型名 */l l char name10; /*结构体成员,以下都是结构体成员,以下都是*/l int age;l char sex3;l char xh11;l char nation20;l char address20;l char 20;lwang,zhang;
6、79.1.2 结构体变量的定义和初始化结构体变量的定义和初始化l不定义结构体类型名,直接定义结构体变量。例如:不定义结构体类型名,直接定义结构体变量。例如:lstruct l char name10;l int age;l char sex3;l char xh11;l char nation20;l char address20;l char 20;lwang,zhang;8结构体类型的长度结构体类型的长度 l结构体类型的长度可以用结构体类型的长度可以用sizeof运算符计算出来,形运算符计算出来,形式为:式为:lsizeof(结构体类型名结构体类型名) l或者或者lsizeof(变量名变量
7、名)l如如sizeof(struct student) 或或sizeof(wang),在,在TC和和VC下,结果分别是:下,结果分别是:86和和88。9结构体类型的嵌套结构体类型的嵌套 struct date int year; int month; int day;struct student char name10; int age; char sex3; char xh11; struct date birthday; char nation20; char address20; char 20;wang,zhang; struct student char name10; int ag
8、e; char sex2; char xh11; struct int year; int month; int day; birthday; char nation20; char address20; char 20;wang,zhang; 10结构体类型变量的初始化结构体类型变量的初始化 l定义的同时初始化定义的同时初始化lstruct student wang=王云平王云平,18,男男,2019010001,汉族汉族,北京北京,zhang=张丽张丽,18,男男,2019010002,汉族汉族,广州广州,l注意初始化的数据及其类型要与各
9、个成员一一对应,对于注意初始化的数据及其类型要与各个成员一一对应,对于包含嵌套结构体类型的变量,其嵌套部分的初始化也按顺包含嵌套结构体类型的变量,其嵌套部分的初始化也按顺序赋初值序赋初值 lstruct student wang=王云平王云平,18,男男,2019010001,2019,3,3,汉族汉族,北京北京119.1.3 结构体变量的引用结构体变量的引用 l数组元素的引用采用数组名和下标结合的引用方法,数组元素的引用采用数组名和下标结合的引用方法,例如例如a2、b5等。结构体变量其成员的引用则采用等。结构体变量其成员的引用则采用成员运算符成员运算符“.”来完成,
10、格式为:来完成,格式为:l结构体变量名结构体变量名.成员名成员名l或或l结构体变量名结构体变量名.结构体成员名结构体成员名.结构体成员名结构体成员名.基本成基本成员名员名l后者是指包含嵌套的结构体类型。后者是指包含嵌套的结构体类型。l例如前面定义的变量例如前面定义的变量wang,其成员引用如下:,其成员引用如下:lwang.agelwang.birthday.year 12留意留意 l结构体的成员引用的形式比普通的变量或数组复杂一些,结构体的成员引用的形式比普通的变量或数组复杂一些,但本质上相当于一个普通变量或数组),可参与该成员所属但本质上相当于一个普通变量或数组),可参与该成员所属数据类型
11、的一切运算。例如:数据类型的一切运算。例如:lwang.age = 20;liage = 20;lprintf(age=%dn,wang.age);lprintf(age=%dn,iage + wang.age);ll成员运算符成员运算符“.”的优先级最高,在表达式中的结构体变量成员不的优先级最高,在表达式中的结构体变量成员不需要加括号。例如:需要加括号。例如:lwang.age+;l相当于相当于l(wang.age)+; 13留意留意l结构体变量的成员名可以相同,但必须处在不同的层次。结构体变量的成员名可以相同,但必须处在不同的层次。例如:例如:lsturct studentl int no
12、;l char name20;l struct int no; char classname20; class;l struct int no; char groupname20; group;l wang;l上面的结构体存在几个相同的成员上面的结构体存在几个相同的成员no,但层次不同,其引,但层次不同,其引用形式能够区别开来,引用形式分别如下:用形式能够区别开来,引用形式分别如下:lwang.nolwang.class.nolwang.group.no 14留意留意l同一类型的结构体变量可相互赋值。同一类型的结构体变量可相互赋值。l我们知道,数组之间不能整体赋值,但同类型我们知道,数组之间不
13、能整体赋值,但同类型的两个结构体变量之间可以整体赋值,这样可的两个结构体变量之间可以整体赋值,这样可以提高程序的效率。例如:以提高程序的效率。例如:lzhang = wang;lzhang.birthday = wang.birthday;15【例【例9-1】演示结构体类型。】演示结构体类型。 #include #include struct dateint year;int month;int day; ;struct studentchar name10;int age;char sex3;char xh11;struct date birthday;char nation20;char
14、address20;char 20;16【例【例9-1】演示结构体类型。】演示结构体类型。main() struct student wang = Wang YunPing,18,M,2019010001, 2019,3,3,Han,Bei Jing,zhang;zhang = wang;strcpy(,Zhang Li);strcpy(zhang.xh,2019010002);zhang.birthday.year=2019;zhang.birthday.month=4;zhang.birthday.day=4;strcpy(zhang.addr
15、ess,Guang Zhou);strcpy(zhang.;printf(%s,%d,%s,%s,,zhang.age,zhang.sex, zhang.xh); printf(%d,%d,%d,zhang.birthday.year,zhang.birthday.month, zhang.birthday.day);printf(%s,%s,%sn,zhang.nation,zhang.address,zhang.); 179.1.4 结构体数组结构体数组 l结构体类型既可以定义单个的变量,也可结构体类型既可以定义单个的变量,也可以定义结构体数组
16、,用以存储批量的数据。以定义结构体数组,用以存储批量的数据。 18结构体数组的定义结构体数组的定义l和结构体变量定义一样,结构体数组的定义也和结构体变量定义一样,结构体数组的定义也有以下有以下3种方法种方法 :l先定义结构体类型,用结构体类型名定义结构先定义结构体类型,用结构体类型名定义结构体数组,例如:体数组,例如:lstruct student;lstruct student stud50; l定义结构体类型名的同时定义结构体数组,例定义结构体类型名的同时定义结构体数组,例如:如:lstruct student stud50; l不定义结构体类型名,直接定义结构体数组,不定义结构体类型名,
17、直接定义结构体数组,例如:例如:lstruct stud50; 19结构体数组的初始化结构体数组的初始化l和普通数组的元素是普通变量一样,结构体数和普通数组的元素是普通变量一样,结构体数组的每一个元素相当于一个结构体变量,二者组的每一个元素相当于一个结构体变量,二者的初始化也很类似,例如:的初始化也很类似,例如:lstruct student stud2=l 王云平王云平,18,男男,2019010001,汉族汉族,北京北京 l 张丽张丽,18,男男,2019010003,汉族汉族,广广州州20结构体数组的引用结构体数组的引用l结构体数组元素
18、的成员表示为:结构体数组元素的成员表示为:l结构体数组名结构体数组名下标下标.成员名成员名l或或l结构体数组名结构体数组名下标下标.结构体成员名结构体成员名.结构体成员名结构体成员名.成成员名员名l例如:例如:lstudi.agelstud5.birthday.yearl结构体数组元素和类型相同的结构体变量一样,可相互结构体数组元素和类型相同的结构体变量一样,可相互赋值。例如:赋值。例如:lstud1 = stud0;l对于结构体数组元素内嵌的结构体类型成员,情况也相对于结构体数组元素内嵌的结构体类型成员,情况也相同。例如:同。例如:lstudent2.birthday=student1.bi
19、rthday; 21【例【例9-2】演示结构体数组的定义和应用。】演示结构体数组的定义和应用。 #include #include struct dateint year;int month;int day;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;char 20;22【例【例9-2】演示结构体数组的定义和应用。】演示结构体数组的定义和应用。main() struct student stud3=Wang YunPing,18,M
20、,2019010001,2019,3,3, Han,Bei Jing Zhang Li,18,M,2019010002,2019,4,4,Han, Guang ZhouGu YuPing,18,F,2019010003,2019,5,5,Han, Shang Haiint i;for(i=0;i3;i+)printf(%s,%d,%s,%s,,studi.age,studi.sex,studi.xh);printf(%d,%d,%d,studi.birthday.year,studi.birthd
21、ay.month, studi.birthday.day);printf(%s,%s,%sn,studi.nation,studi.address,studi.); 23【例【例9-2】用键盘输入数据,程序修改为】用键盘输入数据,程序修改为struct student stud3;int i;for(i=0;iagel由于由于*p其实相当于其实相当于wang,所以,所以(*p).age相当相当于于wang.age。l“-”是一个运算符,和是一个运算符,和“.”优先级相同,具优先级相同,具有最高的优先级,用于成员的引用。有最高的优先级,用于成员的引用。27【例【例9-3】修改例】修改例9-2,利
22、用结构,利用结构体指针变量访问数据。体指针变量访问数据。 struct student *p;int i;p=&wang;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-address,p-);p=&stud0;for(i=0;iname,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthda
23、y.month, p-birthday.day); printf(%s,%s,%sn,p-nation,p-address,p-);p+;28【例【例9-3】修改例】修改例9-2,利用结构体指,利用结构体指针变量访问数据。针变量访问数据。l第第1行的输出是行的输出是p指向结构体变量指向结构体变量wang后输出的。后输出的。这样的访问方式和结构体变量访问方式差不多。这样的访问方式和结构体变量访问方式差不多。l第第2行至第行至第4行是行是p指向结构体数组后输出的。当指向结构体数组后输出的。当p指向指向&stud0,即第一个结构体数组元素时,即第一个结构体数组元素时,输出第一个元素的所有成员
24、;输出第一个元素的所有成员;lp+表示结构体类型指针变量移动一个结构体类表示结构体类型指针变量移动一个结构体类型单位,指向下一个结构体数组元素型单位,指向下一个结构体数组元素stud1。299.1.6 结构体与函数结构体与函数 l结构体类型和函数的关系表现在:结构体类型和函数的关系表现在:l结构体变量成员作为函数的参数。结构体变量成员作为函数的参数。l结构体变量作为函数的参数。结构体变量作为函数的参数。l结构体指针作为函数的参数。结构体指针作为函数的参数。 30【例【例9-4】打印学号为】打印学号为20190102学生学生的年龄。的年龄。 #include #include struct da
25、teint year;int month;int day;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;char 20;31【例【例9-4】打印学号为】打印学号为20190102学生学生的年龄。的年龄。void showage(int age)printf(Age:%dn, age);void show1(struct student s) /*结构体变量作为形参*/printf(%s,%d,%s,%s,,s.age,s.
26、sex,s.xh);printf(%d,%d,%d,s.birthday.year,s.birthday.month,s.birthday.day);printf(%s,%s,%sn,s.nation,s.address,s.);void show2(struct student *p) /*结构体指针作为形参*/printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-addre
27、ss,p-);void show3(struct student s,int n) /*结构体数组作为形参*/int i;for(i=0;in;i+)printf(%s,%d,%s,%s,,si.age,si.sex,si.xh);printf(%d,%d,%d,si.birthday.year,si.birthday.month,si.birthday.day); printf(%s,%s,%sn,si.nation,si.address,si.); 32【例【例9-4】打印学号为】打印学号为20190102学生学生的年龄。的年龄。void main()struct stude
28、nt wang =Wang YunPing,18,M,2019010001,2019,3,3,Han,Bei Jing,struct student zhang=Zhang Li,18,M,2019010002,2019,4,4,Han,Guang Zhoustruct student stud3=Wang YunPing,18,M,2019010001,2019,3,3,Han,Bei JingZhang Li,18,M,2019010002,2019,4,4,Han,Guang Zhou
29、Gu YuPing,18,F,2019010003,2019,5,5,Han,Shang Haistruct student *p;struct student t; printf(Demo showage:n);showage(wang.age); /*结构体成员作为实参结构体成员作为实参*/printf(Demo show1:n);show1(wang);/*结构体变量作为实参结构体变量作为实参*/p=&wang;printf(Demo show2:n);show2(p); /*结构体指针作为实参,也可以写成结构体指针作为实参,也可以写成show2(&am
30、p;wang) */printf(Demo show3:n); show3(stud,3); /*结构体数组名作为实参结构体数组名作为实参*/*结构体变量交换结构体变量交换*/t=wang;wang=zhang;zhang=t;printf(Demo swap:n);show1(zhang); 33【例【例9-4】打印学号为】打印学号为20190102学生学生的年龄。的年龄。l运行结果运行结果34【留意】【留意】l由于结构体由于结构体struct student作为主函数之外其他作为主函数之外其他函数的形式参数,所以结构体的定义需要放在函数的形式参数,所以结构体的定义需要放在函数之外,不能放在
31、主函数函数之外,不能放在主函数main内。内。lshow1(wang)写成写成show1(stud0)效果一样,效果一样,结构体数组元素也相当于一个结构体变量,例结构体数组元素也相当于一个结构体变量,例题中正好对应的成员数据也一样。题中正好对应的成员数据也一样。l结构体变量不同于数组体现在结构体变量名需结构体变量不同于数组体现在结构体变量名需要计算才能得到结构体数据域的地址,如要计算才能得到结构体数据域的地址,如:l&wang。l而数组名直接代表所有数组元素的首地址,不而数组名直接代表所有数组元素的首地址,不过也可以计算得到某一个元素的地址,如过也可以计算得到某一个元素的地址,如:l&
32、amp;stud235【例【例9-5】演示函数返回结构体类型。】演示函数返回结构体类型。 struct student seek1(struct student s,int n,char name)int i;for(i=0;in;i+)if(strcmp(,name) = 0)break;return si;struct student* seek2(struct student s,int n,char name)int i;for(i=0;in;i+)if(strcmp(,name) = 0)break;return &si;struct studen
33、t* seek3(struct student s,int n,char name)int i;struct student *p=s;for(i=0;iname,name) = 0)break;elsep+;return p;36【例【例9-5】演示函数返回结构体类型。】演示函数返回结构体类型。void show1(struct student s)printf(%s,%d,%s,%s,,s.age,s.sex,s.xh);printf(%d,%d,%d,s.birthday.year,s.birthday.month,s.birthday.day);printf(%s,%s,%
34、sn,s.nation,s.address,s.);void show2(struct student *p)printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-address,p-); 37【例【例9-5】演示函数返回结构体类型。】演示函数返回结构体类型。main()struct student stud3=Wang YunPing,18,M,2019010001,2019
35、,3,3,Han,Bei JingZhang Li,18,M,2019010002,2019,4,4,Han,Guang ZhouGu YuPing,18,F,2019010003,2019,5,5,Han,Shang Haishow1(seek1(stud,3,Gu YuPing);show2(seek2(stud,3,Zhang Li);show2(seek3(stud,3,Wang YunPing); 389.2 共用体共用体 l为了节约内存或便于对数据进行处理,为了节约内存或便于对数据进行处理,C语言语言允许
36、不同类型的数据共享在一段存储单元,这允许不同类型的数据共享在一段存储单元,这种共享存储单元的特殊数据类型叫做种共享存储单元的特殊数据类型叫做“共用体共用体类型,也可称之为类型,也可称之为“结合类型。结合类型。l共用体的定义和结构体相似,可以借鉴结构体共用体的定义和结构体相似,可以借鉴结构体部分,其中不同的地方在本节中将逐一指出。部分,其中不同的地方在本节中将逐一指出。399.2.1 共用体类型的定义共用体类型的定义l共用体类型的定义形式为:共用体类型的定义形式为:lunion 类型名类型名l l 成员说明列表成员说明列表l;l例如:例如:lunion datal char c;l float
37、f;l double d;l; 409.2.2 共用体变量的说明和引用共用体变量的说明和引用 l与结构体变量的说明类似,也有与结构体变量的说明类似,也有3种方式:种方式:l先定义共用体类型,再用共用体类型定义共用体变量。先定义共用体类型,再用共用体类型定义共用体变量。lunion 类型名类型名l l 成员说明列表成员说明列表l;lunion 类型名类型名 共用体变量名表共用体变量名表;。l例如,例如,union data x;l定义共用体类型名的同时定义共用体变量。定义共用体类型名的同时定义共用体变量。lunion 类型名类型名l 成员说明列表成员说明列表共用体变量名表共用体变量名表; l不定
38、义类型名直接定义共用体变量不定义类型名直接定义共用体变量 41留意留意 lunion data或变量或变量x,表达式,表达式sizeof(union data)和和sizeof(x)的值均为的值均为8。 42引用共用体变量引用共用体变量l引用共用体变量的形式以及注意事项均与引用结构体引用共用体变量的形式以及注意事项均与引用结构体变量相似,例如:变量相似,例如:lx.c /* 共用体字符型成员,相当于普通字符型变量共用体字符型成员,相当于普通字符型变量 */l对共用体变量中的任何一个成员赋值,都会导致共享对共用体变量中的任何一个成员赋值,都会导致共享区域数据发生变化,所以共用体只能保证只有一个成
39、区域数据发生变化,所以共用体只能保证只有一个成员的值是有效的。例如,对于共用体变量员的值是有效的。例如,对于共用体变量x,假设有:,假设有:lx.f = 3.14159;l必然使得地址必然使得地址10001011四个字节的内容发生变化四个字节的内容发生变化 l整体引用共用体变量没有多大的意义,通常都是引用整体引用共用体变量没有多大的意义,通常都是引用共用体变量的成员共用体变量的成员 43【例【例9-6】演示共用体类型的引用】演示共用体类型的引用 #include stdio.h#include string.hstruct dateint year;int month;int day; ;un
40、ion callchar mobile20;int telephone;struct studentchar name20;int age;char sex3;char xh11;struct date birthday;char nation20;char address20;union call callnumber; ;44【例【例9-6】演示共用体类型的引用】演示共用体类型的引用void main()struct student wang =Wang YunPing,18,M,2019010001,2019,3,3,Han,Bei Jing;struct student li =Li
41、Zhen,20,F,2019010001,2019,3,3,Han,He Fei;struct student *p;strcpy(wang.callnumberle;li.callnumber.telephone = 56023328;p = &wang;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%sn,p-nation,p-address,p-callnum
42、berle);p = &li;printf(%s,%d,%s,%s,p-name,p-age,p-sex,p-xh);printf(%d,%d,%d,p-birthday.year,p-birthday.month,p-birthday.day);printf(%s,%s,%ldn,p-nation,p-address,p-callnumber.telephone); 45【例【例9-7】运行下面的程序,分析】运行下面的程序,分析运行结果。运行结果。 #include #include void main()union keycode short int i; char c2;key;
43、printf(size=%dn,sizeof(key);key.i = 16961; /* 0 x4241 */printf(key.c0 = %d,key.c1=%dn,key.c0, key.c1);strcpy(key.c,AB);printf(key.c0 = %c,key.c1=%cn,key.c0, key.c1);printf(key.i = %d(0 x%x)n,key.i,key.i); 46【分析】【分析】l共用体变量共用体变量key有两个成员:有两个成员:short int型成员型成员i和字符和字符数组数组c,它们都占用,它们都占用2字节,因此共用体变量字节,因此共用体变
44、量key长度长度为为2字节。字节。l给给short int型成员型成员i赋值赋值16961,然后将该数据的两个,然后将该数据的两个字节用字符数组字节用字符数组c分别输出,低位字节分别输出,低位字节key.c0为十六为十六进制数进制数42,对应字符,对应字符B;高位字节;高位字节key.c1为十六进为十六进制数制数41,对应字符,对应字符A。l给字符数组给字符数组key.c赋值赋值AB,得到的结果和前面一样。,得到的结果和前面一样。由于长度的限制,这里由于长度的限制,这里strcpy没能把字符串结束符存没能把字符串结束符存入入key.c,对于本题没有关系。,对于本题没有关系。l由此可以看出,由此
45、可以看出,key.i被被key.c0、key.c1拆开成两拆开成两部分,从而分别取得其高位或低位字节部分的内容。部分,从而分别取得其高位或低位字节部分的内容。 479.3 枚举类型枚举类型 l引入引入l假设有序列假设有序列Sunday、Monday、Tuesday、Wednesday、Thursday、Friday、Saturday,从星期的名称上不能体现他们的,从星期的名称上不能体现他们的顺序,但如果将其与下面的序列对应就可以体顺序,但如果将其与下面的序列对应就可以体现了:现了:0、1、2、3、4、5、6。l这两种序列都有优点,前者表达的意义自然明这两种序列都有优点,前者表达的意义自然明确,
46、容易接受;后者更能体现星期名称之间的确,容易接受;后者更能体现星期名称之间的顺序。顺序。l能否将二者结合起来,形成一种新的数据类型?能否将二者结合起来,形成一种新的数据类型? 489.3.1 枚举类型的定义枚举类型的定义 l枚举类型定义的形式为:枚举类型定义的形式为:lenum 类型名类型名标识符序列标识符序列;l如:如:lenum weekSunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday; lenum是定义枚举类型的关键字,枚举类是定义枚举类型的关键字,枚举类型型week包含包含7个标识符序列,分别等于个标识符序列,分别等于0、
47、1、2、3、4、5、6,这些标识符常量是,这些标识符常量是有序的。有序的。49留意留意l枚举值标识符是常量不是变量,这些常量是基本数据类枚举值标识符是常量不是变量,这些常量是基本数据类型。型。l枚举值只能是一些标识符,不能是基本类型常量。下面枚举值只能是一些标识符,不能是基本类型常量。下面的定义是错误的:的定义是错误的:lenum week0,1,2,3,4,5,6;l可以在定义枚举类型时对枚举常量重新定义值,如:可以在定义枚举类型时对枚举常量重新定义值,如:lenum weekMonday=1,Tuesday,Wednesday,Thursday,Friday,Saturday, Sunda
48、y;l这样对应的序列为:这样对应的序列为:1、2、3、4、5、6、7。l下面的定义也是可以的:下面的定义也是可以的:lenum colorblack,blue,green,red=4,yellow=14,white;l此时此时red为为4,yellow为为14,white为为15。 509.3.2 枚举变量的定义和引用枚举变量的定义和引用 l枚举变量的定义枚举变量的定义l形式可以为:形式可以为:lenum类型名类型名 变量名表变量名表; lenum类型名类型名标识符序列标识符序列 变量名表变量名表;lenum 标识符序列标识符序列 变量名表变量名表;l例如:例如:lenum color bac
49、kcolor;lenum color black,blue,green,red=4,yellow=14,whitebackcolor;lenum black,blue,green,red=4,yellow=14,whitebackcolor;lenum week firstweek,nextweek; 51枚举变量的引用枚举变量的引用 l正确的引用方式:正确的引用方式:lbackcolor = red; lbackcolor = 4;lbackcolor +; /*假设原来是假设原来是red,现在将变成,现在将变成yellow了了*/lif(backcolor = red) printf(Th
50、e color is redlscanf(%d,& backcolor); /*输入一个整型数给输入一个整型数给backcolor变量,不过必须在枚举类型定义的范围之变量,不过必须在枚举类型定义的范围之内,可以是内,可以是0、1、2、4、14、15,其他都是错误的。,其他都是错误的。*/l错误的引用方式错误的引用方式lbackcolor = 3; /*不在枚举类型定义的范围之内不在枚举类型定义的范围之内*/lbackcolor = grey;/*不在枚举类型定义的范围之不在枚举类型定义的范围之内内*/l由于枚举变量可以作为循环变量,因此可以利用循环由于枚举变量可以作为循环变量,因此可以
51、利用循环和和switch语句打印全部的枚举值字符串。语句打印全部的枚举值字符串。 52【例【例9-8】输出全部的枚举值字符串。】输出全部的枚举值字符串。 #include enum eweekMonday=1,Tuesday,Wednesday,Thursday,Friday,Saturday, Sunday;void main()char weekname720=Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday;enum eweek week;for(week = Monday ; week = Sunday ; week+)p
52、rintf(%d:%sn,week,weeknameweek%7); 539.4 用户定义类型用户定义类型 lC语言不仅提供了丰富的数据类型,还允许用语言不仅提供了丰富的数据类型,还允许用于自己定义类型说明符,相当于允许用户为数于自己定义类型说明符,相当于允许用户为数据类型取据类型取“别名别名”。所用的类型定义符是。所用的类型定义符是typedef。 549.4 用户定义类型用户定义类型l名称替换名称替换l定义的形式为:定义的形式为:ltypedef 类型名类型名 别名别名;l“类型名必须是系统提供的数据类型或用户已定义类型名必须是系统提供的数据类型或用户已定义的数据类型,的数据类型,“别名是
53、标识符。别名是标识符。l例如:例如:ltypedefint INTEGER;ltypedefstruct studentSTUDENT;ltypedefstructint year;int month;int day DATE;ltypedefchar* CHAR; /*char* 是字符指针类型是字符指针类型*/ 559.4 用户定义类型用户定义类型l有了上面的替换,就可以定义相应类型的变量了:有了上面的替换,就可以定义相应类型的变量了:lINTEGER a,b;/*相当于相当于int a,b */lSTUDENT wang,zhang; /*相当于相当于struct student wan
54、g,zhang; */lDATE birthday; /* 相当于相当于structint year;int month;int day birthday;*/lCHAR string=Hello World!;/*相当于相当于char * string=Hello World! */lCHAR p=&s; /*相当于相当于char * p=&s */ 569.4 用户定义类型用户定义类型l定义数组类型定义数组类型l定义的形式为:定义的形式为:ltypedef 类型名类型名 别名别名数组长度数组长度;l例如:例如:ltypedef int NUM3;ltypedef char
55、STRING20;l定义相应类型的变量:定义相应类型的变量:lNUM a,b; /*相当于相当于 int a3,b3 */lSTRING s; /*相当于相当于char s20 */l就定义了该结构体类型的变量和指针变量就定义了该结构体类型的变量和指针变量 579.4 用户定义类型用户定义类型l留意:留意:l定义新类型名时一般用大写的标识符,以便区别于习惯的写法,定义新类型名时一般用大写的标识符,以便区别于习惯的写法,并不是必须的。并不是必须的。l用用typedef定义类型只是定义新的类型名而不是创建新的数据类型。定义类型只是定义新的类型名而不是创建新的数据类型。l注意定义新类型名与宏替换的区
56、别。例如:注意定义新类型名与宏替换的区别。例如:ltypedef int INTEGER;l#define INTEGER intl上述定义的作用都是用标识符上述定义的作用都是用标识符INTEGER代替代替int,但实质不同。,但实质不同。typedef是用标识符是用标识符INTEGER代替类型代替类型“int”,而,而#define是用标是用标识符识符INTEGER代替字符串代替字符串“int”;typedef在编译时解释在编译时解释INTEGER,而,而#define是在编译之前将是在编译之前将INTEGER替换成字符串替换成字符串“int”;typedef并不是做简单替换,例如:并不是做
57、简单替换,例如:ltypedef int NUM3;l不是简单地将不是简单地将NUM3替换成替换成int,因为,因为NUM a;相当于相当于int a3;而不而不是是int a;。 589.5 程序举例程序举例 l【例【例9-9】编程求两个复数的和。】编程求两个复数的和。 l#includelstruct complexldouble r;double i;lstruct complex add(struct complex x,struct complex y)lstruct complex z;lz.r=x.r+y.r;z.i=x.i+y.i;lreturn z;llvoid main()
58、lstruct complex z,add(struct complex,struct complex);lstruct complex x=1.2,2.5,y=2.4,5.6;lz=add(x,y);lprintf(x+y=%.2f+%.2fin,z.r,z.i);l 59【例【例9-10】已知今天的日期,编】已知今天的日期,编程求出明天的日期。程求出明天的日期。 #includestruct dateint year,month,day; ;int judge(struct date *pd)int l_year=0;if (pd-year%4=0&pd-year%100!=0)|
59、pd-year%400=0)l_year=1;return l_year;int day_no(struct date *pd)int day;int month13=0,31,28,31,30,31,30,31,31,30,31,30,31;if (judge(pd)&(pd-month=2)day=29;elseday=monthpd-month;return day;60【例【例9-10】已知今天的日期,编】已知今天的日期,编程求出明天的日期。程求出明天的日期。main()struct date today,tomorrow;int judge(struct date*),day
60、_no(struct date *);printf(Enter today(yyyy,mm,dd): );scanf(%d-%d-%d,&today.year,&today.month,&today.day);if (today.day!=day_no(&today)tomorrow.day=today.day+1;tomorrow.month=today.month;tomorrow.year=today.year;else if (today.month=12)tomorrow.day=1;tomorrow.month=1;tomorrow.year=today.year+1;elsetomorrow.day=1;tomorrow.month=today.month+1;tomorrow.ye
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026福建莆田市机关幼儿园招聘新任教师1人考试备考试题及答案解析
- 2026华北理工大学附属医院选聘13人(河北)笔试模拟试题及答案解析
- 达州市2026年上半年公开考试招聘事业单位工作人员(538人)考试参考题库及答案解析
- 2026四川成都九洲迪飞科技有限责任公司招聘市场部部长等岗位3人考试参考题库及答案解析
- 2026江苏镇江高等职业技术学校招聘教师6人笔试参考题库及答案解析
- 2026江西晶昊盐化有限公司安全生产总监岗位(第三次)招聘1人考试备考试题及答案解析
- 2026年上半年洪雅县公开考试招聘中小学教师(30人)考试备考试题及答案解析
- 2026年河北廊坊三河市一衡高级中学招聘教师笔试参考题库及答案解析
- 2026中国科大核科学技术学院劳务派遣岗位招聘1人考试备考题库及答案解析
- 未来五年新形势下亚麻纱行业顺势崛起战略制定与实施分析研究报告
- 2026年九江职业大学单招职业适应性测试题库附答案详解(达标题)
- 车辆维修工考核制度
- 2025年中国人力资源数字化行业研究报告
- 动静脉内瘘PTA球囊扩张课件
- 脑卒中病人的并发症预防与护理
- 2025年中学教师资格证《综合素质》考试真题及答案(完整版)
- 露天矿山作业安全培训课件
- 2026年电商代运营合同范本
- 2025至2030数字PCR和实时PCR(qPCR)行业调研及市场前景预测评估报告
- 2025越南建材市场供需矛盾与政策调控思路研究
- 2026年上海市各区高三语文一模试题汇编之古诗鉴赏(教师版)
评论
0/150
提交评论