第7章 自定义数据类型教学课件PPT.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《第7章 自定义数据类型教学课件PPT.ppt》由会员分享,可在线阅读,更多相关《第7章 自定义数据类型教学课件PPT.ppt(65页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、完整版教学课件完整版教学课件第7章 自定义数据类型 第7章 自定义数据类型u7.1 求同存异:结构体类型求同存异:结构体类型u7.2 伙伴牵手:链表伙伴牵手:链表u7.3 你中有我:共用体类型你中有我:共用体类型u7.6 本章小结本章小结u7.4 心中有数:枚举类型心中有数:枚举类型u7.5 别名当道:别名当道:typedef类型类型 7.1 结构体类型7.1.1 结构体类型的引入 【案例7.1】 如何使用程序实现对歌曲排行榜的管理?如何使用程序实现对歌曲排行榜的管理? 首先需要使用一种数据类型表示首先需要使用一种数据类型表示上表上表的结构。通过观察表格,不难发现的结构。通过观察表格,不难发现
2、在表格在表格“列列”的方向上数据类型相同,回顾之前学过的数组概念及应用时发的方向上数据类型相同,回顾之前学过的数组概念及应用时发现,要想对现实世界中的一组或一系列相似的事物进行建模,数组是理想的现,要想对现实世界中的一组或一系列相似的事物进行建模,数组是理想的工具。若采用数组结构,在实现时,可定义工具。若采用数组结构,在实现时,可定义4个数组,分别存储歌曲编号、个数组,分别存储歌曲编号、歌曲名称、歌手姓名和票数,假设本期共有歌曲名称、歌手姓名和票数,假设本期共有40首歌曲,初始化的代码为:首歌曲,初始化的代码为:47.1 结构体类型int No40=1001,1002,1003 ; /*歌曲编
3、号歌曲编号*/char song_name4032=My Old Classmate,Those Flowers,Tomorrow will be better; /*歌曲名称歌曲名称*/char name4016=Lao Lang, Pu Shu,Luo Dayou;/*歌手姓名歌手姓名*/但存在的问题:但存在的问题:( (1) )分配内存不集中,寻址效率不高:每首歌曲本来是很统一的数据分配内存不集中,寻址效率不高:每首歌曲本来是很统一的数据( (表中表中的的一一行行) ),使用数组后却零散地分布在内存中,查找效率不高。,使用数组后却零散地分布在内存中,查找效率不高。( (2) )对数组赋初
4、值时,易发生错位,而且一旦出错,后面所有的数据也都会发生对数组赋初值时,易发生错位,而且一旦出错,后面所有的数据也都会发生错误。错误。 ( (3) )结构非常零散,造成数据管理上的困难。结构非常零散,造成数据管理上的困难。 希望的组织方式:希望的组织方式:从表格从表格“行行”(在数据库中称为在数据库中称为“记录记录”)的角度进行观察,的角度进行观察,将每首歌曲的信息单独集中在某一段内存中进行存放。将每首歌曲的信息单独集中在某一段内存中进行存放。C语言提供了这样一种数据语言提供了这样一种数据类型,称为类型,称为结构体结构体,它和数组一样,也,它和数组一样,也属于构造数据类型。属于构造数据类型。5
5、7.1 结构体类型7.1.2 结构体变量的定义、初始化和引用1 1结构体变量的定义结构体变量的定义struct 结构体类型名结构体类型名数据类型数据类型 成员名成员名1;数据类型数据类型 成员名成员名2;数据类型数据类型 成员名成员名n;其中,其中,“struct”是声明结构体模板的关键字,其后是是声明结构体模板的关键字,其后是“结构体类型名结构体类型名”,在,在“结构体类型名结构体类型名”后的后的花花括号中,声明了结构体类型的各成员项,每个成员由括号中,声明了结构体类型的各成员项,每个成员由“数据类型数据类型”和和“成员名成员名”共同组成。共同组成。“成员名成员名”和程序中的其他变量名可以和
6、程序中的其他变量名可以同名,互不干扰。最后的分号是结构体声明的结束标志,不可省略。同名,互不干扰。最后的分号是结构体声明的结束标志,不可省略。struct ranking_list int No; /*歌曲编号歌曲编号*/ char song_name32;/*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num;/*票数票数*/;注意:注意:在在“声明声明”过程中,并未定义任何结过程中,并未定义任何结构体变量,因而编译器不为其分配内存。构体变量,因而编译器不为其分配内存。67.1 结构体类型定义结构体变量定义结构体变量:( (1) )先声明结构体类型,再定
7、义结构体变量,其格式为:先声明结构体类型,再定义结构体变量,其格式为:struct 结构体类型名结构体类型名 结构体变量名结构体变量名;例如:例如:struct ranking_list rl; 此时定义了结构体变量此时定义了结构体变量rl,它具有歌曲编号,它具有歌曲编号No、歌曲名称、歌曲名称song_name、歌手姓名歌手姓名name和票数和票数num这这4个成员,且这些成员占据的是连续的内存空间个成员,且这些成员占据的是连续的内存空间。 (2) 在定义类型的同时定义变量,如:在定义类型的同时定义变量,如: struct ranking_list int No; /*歌曲编号歌曲编号*/
8、char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/ rl;(3)直接定义结构体变量直接定义结构体变量(不指定结构体类型名不指定结构体类型名),如,如:struct int No; /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/rl;该该方法由于未给定结构体类型名,是一个匿名结构体,不能在程序的其方法由于未给定结构体类型名,是一个匿名结构体,不能在程序的其他地方定义结构体变
9、量,因此通用性不好,一般使用较少。他地方定义结构体变量,因此通用性不好,一般使用较少。77.1 结构体类型结构体变量结构体变量rl所占据的所占据的内存空间内存空间可以利用表达式可以利用表达式sizeof(rl)求出求出。【案例【案例7.2】 计算结构体变量所占据的内存大小。计算结构体变量所占据的内存大小。#include struct numchar a;double b;int c;short d;S;int main()() printf( (结构体变量结构体变量S所占据的内存大小为:所占据的内存大小为:%dn,sizeof( (S); return 0; 结构体变量占据的内存大小是按照结
10、构体变量占据的内存大小是按照“字节对齐字节对齐”的机制来分配的。字节对齐是的机制来分配的。字节对齐是指字节按照一定规则在空间上排列。该规则要同时满足以下两点指字节按照一定规则在空间上排列。该规则要同时满足以下两点: 87.1 结构体类型( (2) )结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果不结构体的总大小为结构体最宽基本类型成员大小的整数倍,如果不够,编译器会在最末一个成员之后加上填充字节。够,编译器会在最末一个成员之后加上填充字节。 因此,刚才计算出结构体变量因此,刚才计算出结构体变量S的内存大小的内存大小22并不符合这一点,并不符合这一点,本例本例成成员变量中最宽基本类型的
11、大小为员变量中最宽基本类型的大小为8( (sizeof( (double),所以成员,所以成员d后面会被填后面会被填充充2字节,使得最终结构体变量字节,使得最终结构体变量S所占内存大小为所占内存大小为24字节。字节。如果结构体中有构造类型变量,如结构体中有如果结构体中有构造类型变量,如结构体中有int类型数组成员,则偏移类型数组成员,则偏移量以数组中的元素类型为基准,即偏移量是量以数组中的元素类型为基准,即偏移量是4(sizeof(int)的倍数。的倍数。 ( (1) )结构体的每个成员变量相对于结构体首地址的偏移量,是该成员变量结构体的每个成员变量相对于结构体首地址的偏移量,是该成员变量的基
12、本数据类型的基本数据类型( (不包括结构体、数组等不包括结构体、数组等) )大小的整数倍,如果不够,编译器大小的整数倍,如果不够,编译器会在成员之间加上填充字节会在成员之间加上填充字节。97.1 结构体类型2 2结构体变量的初始化结构体变量的初始化由于结构体变量中存储的是一组类型不同的数据,因此,为结构体变量由于结构体变量中存储的是一组类型不同的数据,因此,为结构体变量初始化的过程其实就是为结构体中各个成员初始化的过程。一般可以使用初始化的过程其实就是为结构体中各个成员初始化的过程。一般可以使用以下两种方法。以下两种方法。( (1) )在定义结构体变量的同时直接进行初始化,例如:在定义结构体变
13、量的同时直接进行初始化,例如:struct ranking_list int No; /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/rl1001,My Old Classmate,Lao Lang,0;( (2) )声明好结构体类型模板后,对结构体变量初始化,例如:声明好结构体类型模板后,对结构体变量初始化,例如:struct ranking_list int No; /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char n
14、ame16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/;struct ranking_list rl1001,My Old Classmate,Lao Lang,0;107.1 结构体类型如果继续进行初始化,如果继续进行初始化,struct ranking_list rl21002,Those Flowers,Pu Shu,0;那么,两个独立的结构体变量那么,两个独立的结构体变量rl和和rl2都具有相同的都具有相同的struct ranking_list类型的结类型的结构,分别对应于表中的两行记录信息,且它们之间可以相互赋值,例如:构,分别对应于表中的两行记录信息,且它们之
15、间可以相互赋值,例如:rl=rl2; /*注意:只有相同类型的结构体变量间才可以相互赋值注意:只有相同类型的结构体变量间才可以相互赋值*/赋值过程是按照结构体的成员顺序对相应成员逐一进行,赋值结束后,结构体赋值过程是按照结构体的成员顺序对相应成员逐一进行,赋值结束后,结构体变量变量rl各成员和各成员和rl2各成员的值相同,都是各成员的值相同,都是1002,Those Flowers,Pu Shu,0。3 3结构体变量的引用结构体变量的引用结构体变量名结构体变量名.成员名成员名;如:如:rl.num; 其中,点号作为成员其中,点号作为成员( (分量分量) )运算符,它在所有运算符中的级别最高,因
16、此可运算符,它在所有运算符中的级别最高,因此可将将rl.num作为一个整体看待。作为一个整体看待。 一旦引用后,就可以将其作为同种类型的普通变量一样使用,如可一旦引用后,就可以将其作为同种类型的普通变量一样使用,如可以以进行赋进行赋值、自增自减、比较等,例如:值、自增自减、比较等,例如:rl.num+;117.1 结构体类型有了成员运算符后,在结构体变量初始化时,就允许只对部分成员进行初始有了成员运算符后,在结构体变量初始化时,就允许只对部分成员进行初始化,例如:化,例如:struct ranking_list rl3.No=1003; /*在成员名前加上成员运算符在成员名前加上成员运算符(
17、(点号点号) )*/其中,花括号中的其中,花括号中的“.No”就是代表就是代表“rl3.No”,而其他未被初始化的成员,而其他未被初始化的成员中,若数值型成员被初始化为中,若数值型成员被初始化为0,字符型成员被初始化为,字符型成员被初始化为0,指针型成员被初,指针型成员被初始化为始化为NULL。此外,对上述结构体变量间的赋值语句此外,对上述结构体变量间的赋值语句“rl=rl2;”其效果等价于:其效果等价于:rl.No=rl2.No;strcpy( (rl.song_name,rl2.song_name) ); /*注意注意:应:应使用字符串复制函数使用字符串复制函数strcpy*/strcpy
18、( (rl.name,rl2.name) );rl.num=rl2.num;注意:注意:无法通过结构体变量名一次性地输入或输出结构体变量中所有成员的无法通过结构体变量名一次性地输入或输出结构体变量中所有成员的值,只能通过引用对结构体变量中的每个成员依次进行处理。例如:值,只能通过引用对结构体变量中的每个成员依次进行处理。例如:scanf(%d,%s,%s,%dn,&rl); /*整体读入结构体变量整体读入结构体变量rl各成员的值,不合各成员的值,不合法法*/printf(%d,%s,%s,%dn,rl);/*输出结构体变量输出结构体变量rl各成员的值,不合法各成员的值,不合法*/printf(
19、%d,%s,%s,%dn,rl.No,rl.song_name,rl.name,rl.num); /*使用引用分别输出结构体变量使用引用分别输出结构体变量rl各成员的值,合法各成员的值,合法*/scanf(%d, &rl.No); /*使用引用输入结构体变量使用引用输入结构体变量rl中中No成员的值,合法成员的值,合法*/127.1 结构体类型4 4嵌套的结构体结构嵌套的结构体结构 如果在如果在原先的原先的“歌曲排行榜歌曲排行榜”表格中表格中添加一列,用于记录该首歌曲的创作添加一列,用于记录该首歌曲的创作日期,而且日期中又包含了年、月、日等详细信息,就形成了嵌套结构日期,而且日期中又包含了年、
20、月、日等详细信息,就形成了嵌套结构。这就要求在原有结构体模板的基础上做些修改,由于在定义结构体成员时这就要求在原有结构体模板的基础上做些修改,由于在定义结构体成员时所用的数据类型也可以是结构体类型,这样就形成了结构体类型的嵌套。可所用的数据类型也可以是结构体类型,这样就形成了结构体类型的嵌套。可将原先的结构体模板扩充为:将原先的结构体模板扩充为:struct credate /*声明结构体类型声明结构体类型struct credate*/ int year; /*年年*/ int month; /*月月*/ int day; /*日日*/;struct ranking_list int No;
21、 /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ struct credate date; /*创作日期,此处嵌套一层结构体创作日期,此处嵌套一层结构体*/ int num; /*票数票数*/;137.1 结构体类型 结构体类型结构体类型struct ranking_list中的成员中的成员date被定义成另一个结构体被定义成另一个结构体struct credate,用于表示创作日期,而,用于表示创作日期,而struct credate又包含了又包含了3个成员:个成员:year、month和和day。结
22、构体类型的嵌套使得成员数据被进一步划分,这有。结构体类型的嵌套使得成员数据被进一步划分,这有利于对数据的深入分析和处理。利于对数据的深入分析和处理。 此时此时,若要进行嵌套成员的引用,依然采用成员运算符若要进行嵌套成员的引用,依然采用成员运算符( (点号点号) ),并以级,并以级联的方式一层一层地找到最低一级的成员。例如,若定义了结构体变量联的方式一层一层地找到最低一级的成员。例如,若定义了结构体变量rl,想要利用该变量引用歌曲的创作年份,应使用想要利用该变量引用歌曲的创作年份,应使用“rl. date.year”。147.1 结构体类型7.1.3 结构体数组结构体数组一个结构体变量相当于表中
23、的一行,一个结构体变量相当于表中的一行,如如只能表示只能表示“歌曲排行榜歌曲排行榜”表格中的一表格中的一首歌曲的记录信息。那么,如何表示整张的首歌曲的记录信息。那么,如何表示整张的“歌曲排行榜歌曲排行榜”表格呢?显然需要表格呢?显然需要定义结构体数组。结构体数组是结构和数组的结合体,与普通数组不同之处在定义结构体数组。结构体数组是结构和数组的结合体,与普通数组不同之处在于结构体数组中的每个元素都是结构体类型的数据。于结构体数组中的每个元素都是结构体类型的数据。与定义结构体变量一样,可以采用以下三种方式定义结构体数组。与定义结构体变量一样,可以采用以下三种方式定义结构体数组。 ( (1) )先声
24、明结构体类型,后定义结构体数组,例如:先声明结构体类型,后定义结构体数组,例如:struct ranking_list int No; /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/;struct ranking_list rl40; 上述代码都定义了一个有上述代码都定义了一个有40个元素的结构体数组个元素的结构体数组( (表明有表明有40首歌曲首歌曲) ),每,每个元素类型为个元素类型为struct ranking_list,该数组所占的内存字节数为,该数组所占的内
25、存字节数为40*sizeof( (struct ranking_list) )。157.1 结构体类型( (2) )在声明结构体类型的同时定义结构体数组,例如:在声明结构体类型的同时定义结构体数组,例如:struct ranking_list int No; /*歌曲编号歌曲编号*/ char song_name32; /*歌曲名称歌曲名称*/ char name16; /*歌手姓名歌手姓名*/ int num; /*票数票数*/rl40;( (3) )直接定义结构体数组,例如:直接定义结构体数组,例如:struct int No; /*歌曲编号歌曲编号*/ char song_name32;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 自定义数据类型教学课件PPT 自定义 数据类型 教学 课件 PPT
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内