结构体、共用体与枚举.ppt
《结构体、共用体与枚举.ppt》由会员分享,可在线阅读,更多相关《结构体、共用体与枚举.ppt(90页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、9 9结构体、共用体与枚举结构体、共用体与枚举本章导读本章导读 用用户户定定义义类类型型结结构构体体、共共用用体体和和枚枚举举类类型型,包括它们的定义、变量的说明和应用。包括它们的定义、变量的说明和应用。结结构构体体类类型型:结结构构体体数数组组和和指指针针、结结构构体体变变量量和和指指针针作作为为函函数数参参数数、返返回回结结构构体体类类型型数数据据的的函函数数、动动态态内内存存分分配配、链链表表;类类型型定定义义符符typedef;了了解解结结构构体体、共共用用体体和和枚枚举举类类型型数数据据的的特特点点,熟熟练练掌掌握握结结构构体体类类型型、变变量量、数数组组、指指针针变变量量的的定定义
2、义、初初始始化化和和成成员员的的引引用用方方法法;掌掌握握共共用用体体和和枚枚举举类类型型、变变量量的的定定义义和和引引用用;掌掌握握用用户户自自定定义义类型的定义和使用。类型的定义和使用。9.1结构体结构体【问题】什么是结构体类型?什么是结构体变量?结【问题】什么是结构体类型?什么是结构体变量?结构体类型与数组类型有什么区别和联系?构体类型与数组类型有什么区别和联系?姓名姓名年龄年龄 性别性别身份身份证号证号民族民族住址住址电话电话号码号码(字符数组字符数组)(整型整型)(字符字符)(长整型长整型)(字符字符)(字符数组字符数组)(长整型长整型)9.1.1 结构体类型的定义结构体类型的定义结
3、构体类型的定义形式为:结构体类型的定义形式为:struct 类型类型名名成员项表列成员项表列;例如包含上图中全部类型数据的结构体类型的定义如下:例如包含上图中全部类型数据的结构体类型的定义如下:struct person /*结构体类型名结构体类型名*/char name20;/*以下定义成员项的类型和名字以下定义成员项的类型和名字*/int age;char sex;long num;char nation;char address20;long tel;9.1.2 结构体变量的说明结构体变量的说明结构体变量的说明有三种方法:结构体变量的说明有三种方法:1.用已定义的结构体类型名定义变量。用
4、已定义的结构体类型名定义变量。例如:例如:struct person student,worker;/*定义了两个结构体变量定义了两个结构体变量student和和worker*/用上面的结构体类型还可再定义变量:用上面的结构体类型还可再定义变量:struct person men,women;2.在定义结构体类型的同时定义结构体变量。例如:在定义结构体类型的同时定义结构体变量。例如:struct person char name20;int age;long tel;student,worker;一般的形式为:一般的形式为:struct 类型名类型名 成员项表列成员项表列 变量名表列;变量名表
5、列;这样定义的结构体类型也还可多次使用,如:这样定义的结构体类型也还可多次使用,如:struct person men,women;9.1.2 结构体变量的说明结构体变量的说明3.不定义结构体类型名,直接定义结构体变量。不定义结构体类型名,直接定义结构体变量。一般形式为:一般形式为:struct 成员项表列成员项表列变量名表列;变量名表列;9.1.2 结构体变量的说明结构体变量的说明9.1.3 结构体变量的初始化结构体变量的初始化 在以上结构体变量的三种定义的同时都可以进行初始化在以上结构体变量的三种定义的同时都可以进行初始化赋值,例如:赋值,例如:struct person stud1=Wa
6、ng Li,18,M,34011,h,12,13 Bejing Road,2098877,stud2=Yu Ping,19,F,34082,h,12,25 Hefei Road,5531678;注意初始化数据应与类型中的各个成员在位置上一一对注意初始化数据应与类型中的各个成员在位置上一一对应。对于嵌套的结构体类型变量,初始化是对各个基本类型应。对于嵌套的结构体类型变量,初始化是对各个基本类型的成员赋初值,例如:的成员赋初值,例如:struct person student=Wang Li,12,5,1974,M,340201,h,12,13 Bejing Road,2098877;9.1.4
7、结构体变量的引用结构体变量的引用1.引用结构体成员引用结构体成员 在在无无嵌嵌套套的的情情况况下下,引引用用结结构构体体变变量量成成员员的的形形式式为:为:结构体变量名结构体变量名成员名成员名 其中的其中的“.”叫叫“结构体成员运算符结构体成员运算符”,这样引,这样引用的结构体成员相当于一个普通变量用的结构体成员相当于一个普通变量,例如:,例如:student.num /*结构体变量结构体变量student的成员的成员num,相当于一个长整型变量相当于一个长整型变量*/student.name /*结构体变量结构体变量student的成员的成员name,相当于一个字符数组名相当于一个字符数组名
8、*/在在有有嵌嵌套套的的情情况况下下,访访问问的的应应是是结结构构体体的的基基本本成成员员,因因为为只只有有基基本本成成员员直直接接存存放放数数据据,且且数数据据是是基基本本类类型型或或上上面面介介绍绍的的数数组组类类型型,引引用用形形式式为:为:结结构构体体变变量量名名结结构构体体成成员员名名结结构构体体成成员员名名基基本本成成员员名名 即即从从结结构构体体变变量量开开始始,用用成成员员运运算算符符“.”逐逐级级向向下下连连接接嵌嵌套套的的成成员员直直到到基基本本成成员员,不不能能省省略,例如:略,例如:student.birthday.year /*基本成员基本成员year,相当于一个整型
9、变量相当于一个整型变量*/9.1.4 结构体变量的引用结构体变量的引用2.结构体变量的赋值、输入和输出结构体变量的赋值、输入和输出 由于结构体各个成员的类型不同,对结构体变量由于结构体各个成员的类型不同,对结构体变量赋值也只能对其成员进行赋值也只能对其成员进行 结构体变量的输入和输出也都只能对其成员进行结构体变量的输入和输出也都只能对其成员进行 3.同一类型的结构体变量可相互赋值同一类型的结构体变量可相互赋值 同类型的两个结构体变量之间可以整体赋值同类型的两个结构体变量之间可以整体赋值(请比较(请比较数组之间不能整体赋值)数组之间不能整体赋值)stud1=stud2;9.1.4 结构体变量的引
10、用结构体变量的引用【例【例9-19-1】输出结构体数据】输出结构体数据#include main()struct person char name20;struct int month;int day;int year;bd;char sex;long num;st=Wang Li,12,15,1974,M,340201;printf(%s,%d,%d,%d,st.name,st.bd.year,st.bd.month,st.bd.day);printf(%c,%ldn,st.sex,st.num);9.1.5 结构体数组结构体数组1.结构体数组的定义结构体数组的定义 有三种方法。有三种方法。
11、(1)先先定定义义结结构构体体类类型型,用用结结构构体体类类型型名名定定义义结结构构体体数数组,如:组,如:struct stud_typechar name20;long num;int age;char sex;float score;struct stud_type student50;9.1.5 结构体数组结构体数组(2)定义结构体类型名的同时定义结构体数组,如:定义结构体类型名的同时定义结构体数组,如:struct stud_typestudent50;(3)不定义结构体类型名,直接定义结构体数组,如:不定义结构体类型名,直接定义结构体数组,如:structstudent50;2.结
12、构体数组的初始化结构体数组的初始化 结构体数组的一个元素相当于一个结构体变量,结构体数组的一个元素相当于一个结构体变量,结构体数组初始化即顺序对数组元素初始化。结构体数组初始化即顺序对数组元素初始化。如:如:struct stud_type student3=Wang li,80101,18,M,89.5,Zhang Fun,89102,19,M,90.5,Li Ling,89103,20,F,98;9.1.5 结构体数组结构体数组9.1.5 结构体数组结构体数组3.结构体数组的引用。结构体数组的引用。(1)除除初初始始化化外外,对对结结构构体体数数组组赋赋常常数数值值、输输入入和和输输出出、
13、各各种种运运算算均均是是对对结结构构体体数数组组元元素素的的成成员员(相相当当于于普普通通变变量量)进进行行的的。结结构构体体数数组组元元素素的的成员表示为:成员表示为:结构体数组名结构体数组名下标下标.成员名成员名在嵌套的情况下为:在嵌套的情况下为:结构体数组名结构体数组名下标下标结构体成员名结构体成员名结构体结构体成员名成员名成员名成员名(2)结构体数组元素可相互赋值结构体数组元素可相互赋值例如:例如:student1=student2;对对于于结结构构体体数数组组元元素素内内嵌嵌的的结结构构体体类类型型成成员员,情情况况也相同。如:也相同。如:student2.birthday=stud
14、ent1.birthday;(3)其他注意事项也与结构体变量的引用相同,例如:其他注意事项也与结构体变量的引用相同,例如:不允许对结构体数组元素或结构体数组元素内嵌的结不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体赋(常数)值;不允许对结构体数构体类型成员整体赋(常数)值;不允许对结构体数组元素或结构体数组元素内嵌的结构体类型成员整体组元素或结构体数组元素内嵌的结构体类型成员整体进行输入输出等。进行输入输出等。9.1.5 结构体数组结构体数组9.1.5 结构体数组结构体数组在在处处理理结结构构体体问问题题时时经经常常涉涉及及字字符符或或字字符符串串的的输输入入,这时要注意:这时
15、要注意:scanf()函函数数用用%s输输入入字字符符串串遇遇空空格格即即结结束束,因因此此输入带空格的字符串可改用输入带空格的字符串可改用gets函数。函数。在输入字符类型数据时往往得到的是空白符(空在输入字符类型数据时往往得到的是空白符(空格、回车等),甚至运行终止,因此常作相应处理,格、回车等),甚至运行终止,因此常作相应处理,即在适当的地方增加即在适当的地方增加getchar();空输入语句,以消空输入语句,以消除缓冲区中的空白符。除缓冲区中的空白符。【例【例9-2】输入】输入3个学生的信息然后输出。每个学个学生的信息然后输出。每个学生的信息包括学号、姓名和生的信息包括学号、姓名和4门
16、课程的成绩门课程的成绩#include main()struct stu_type long num;char name20;float score4;st3;int i,j;float t;printf(Enter students datas:n);for(i=0;i3;i+)scanf(%ld,&sti.num);getchar();gets(sti.name);【例【例9-2】for(j=0;j4;j+)scanf(%f,&t);sti.scorej=t;printf(No.ttNamettScore1tScore2tScore3tScore4n);for(i=0;i3;i+)prin
17、tf(%ldt%st,sti.num,sti.name);for(j=0;jnum第二种表示与第一种表示等价,运算符第二种表示与第一种表示等价,运算符“-”与与“.”优先级相同,具有最高的优先级。优先级相同,具有最高的优先级。9.1.6 结构体指针结构体指针【例【例9-39-3】利用结构体指针变量输出结构体数据】利用结构体指针变量输出结构体数据/*EX9-3.C */main()struct stu_typelong num;char name20;float score2;student=20050101,wang,89,77.5,*p;p=&student;printf(%ldt%st%6
18、.1f%6.1fn,p-num,p-name,p-score0,p-score1);2.结构体数组与结构体指针变量结构体数组与结构体指针变量一维数组的数组名代表数组的首地址,一维结构体一维数组的数组名代表数组的首地址,一维结构体数组也一样。可以将一维结构体数组名赋给指向结数组也一样。可以将一维结构体数组名赋给指向结构体变量的指针变量,该指针变量将指向下标为构体变量的指针变量,该指针变量将指向下标为0 0的元素,它可以的元素,它可以在数组元素之间移动。在数组元素之间移动。【例【例9-4】用指向结构体变量的指针变量输】用指向结构体变量的指针变量输出结构体数组出结构体数组/*EX9-4.C */ma
19、in()struct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p;printf(No.tNametAgen);for(p=st;pnum,p-name,p-age);【例【例9-5】输出上例中全部学生的】输出上例中全部学生的name信息信息/*EX9-5.C */main()struct stu_typelong num;char name20;int age;st3=1001,wang,19,1002,li,18,1003,zhang,20,*p,*q;q=(struct
20、stu_type*)st0.name;for(p=q;pq+3;p+)printf(%st,p);9.1.7 结构体与函数结构体与函数1.结构体变量和结构体变量成员做函数参数结构体变量和结构体变量成员做函数参数(1)结构体变量成员作为函数的实参结构体变量成员作为函数的实参由于结构体变量成员存放基本类型数据,因此这种情况由于结构体变量成员存放基本类型数据,因此这种情况同基本类型有值变量做实参,实现值传递。要注意实参同基本类型有值变量做实参,实现值传递。要注意实参与形参类型的一致。与形参类型的一致。【例【例9-69-6】打印学号为】打印学号为2005010220050102学生的年龄学生的年龄#d
21、efine N 3void PRINT(int age)printf(Age:%dn,age);main()struct stu_typelong num;char name20;int age;stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti.age);(2)结构体变量作为函数参数结构体变量作为函数参数这种用法的参数形式为:这种用法的参数形式为:形参:结构体变量;形参:结构体变量;实参:有值结构体变量或结构体数组元素。实参:有值结构体变量
22、或结构体数组元素。通通过过实实参参将将相相应应的的结结构构体体类类型型数数据据传传给给对对应应的的形形参参,实现传值调用,不同于数组作参数的传址调用!实现传值调用,不同于数组作参数的传址调用!【注意】在结构体类型数据作为函数参数时,为了【注意】在结构体类型数据作为函数参数时,为了在虚实结合时保持形参与实参类型的一致,应将结构在虚实结合时保持形参与实参类型的一致,应将结构体类型定义成外部的,即在所有函数之前定义结构体体类型定义成外部的,即在所有函数之前定义结构体类型。类型。9.1.7 结构体与函数结构体与函数【例【例9-79-7】打印学号为】打印学号为2005010220050102学生的全部信
23、息学生的全部信息#define N 3struct stu_typelong num;char name20;int age;void PRINT(struct stu_type stu)printf(No.ttNametAgen);printf(%-16ld%st%dn,stu.num,stu.name,stu.age);【例【例9-7】main()struct stu_type stN =20050101,wang,19,20050102,li,18,20050103,zhao,20;int i;for(i=0;iN;i+)if(sti.num=20050102)PRINT(sti);2.
24、结构体指针作为函数参数结构体指针作为函数参数此此用用法法一一般般用用于于结结构构体体数数组组问问题题。与与基基本本类类型型一一维维数组的情况相同,实现传址调用,参数用法如下:数组的情况相同,实现传址调用,参数用法如下:形参:形参:结构体数组或结构体指针变量;结构体数组或结构体指针变量;实参:实参:结构体数组名或取得数组名首地址的结构体结构体数组名或取得数组名首地址的结构体指针变量。指针变量。【例【例9-8】同上例,输出全部学生的信息】同上例,输出全部学生的信息#define N 3struct stu_typelong num;char name20;int age;void PRINT(st
25、ruct stu_type*p)int i;printf(No.ttNametAgen);for(i=0;inum,(p+i)-name,(p+i)-age);main()struct stu_type stN=20050101,wang,19,20050102,li,18,20050103,zhao,20;PRINT(st);3.返回结构体类型数据的函数返回结构体类型数据的函数 函数返回值可以是结构体类型的值,也可以是函数返回值可以是结构体类型的值,也可以是指向结构体变量(或数组元素)的指针。当函数返指向结构体变量(或数组元素)的指针。当函数返回值是结构体类型的值时,称该函数为结构体类型回值
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用 枚举
限制150内