第08章.结构体和枚举类型.ppt
《第08章.结构体和枚举类型.ppt》由会员分享,可在线阅读,更多相关《第08章.结构体和枚举类型.ppt(92页珍藏版)》请在三一办公上搜索。
1、第8章结构体和枚举类型,本章要点:,教学目标本章讲解结构和结构变量的定义格式、结构成员的表示、结构变量的赋初值和赋值、结构变量的运算。在此基础上进一步讲述结构与指针、结构与数组、结构与函数的应用。教学重点和难点 结构体类型的定义 定义和初始化结构体变量 类型定义typedef 结构体数组 结构体指针 结构体与函数 单向链表及其操作 枚举类型,在现实生活中,有许多不同性质的数据实体。比如,通讯录通常由姓名、电话、E-mail、年龄等组成。姓名、电话、E-mail和所在城市可以用字符串表示,年龄可以用整型数表示。可是它们的每一项都是单独使用的,不能反映通讯录这样一个整体。用什么方法表示通讯录这个整
2、体呢?新的被称为结构体的数据类型。为我们处理复杂的数据提供了便利的手段。,8.1.1 什么是结构体结构体(structure)是一种数据类型,它把互相联系的数据组合成一个整体。例如,下面的表格显示了一个通讯录的信息:表8-1 一个通讯录的信息表一个通讯录中有姓名、电话、性别、年龄、E-mail地址、所在城市,这些信息都是和一个叫“李明”的人有关。如果我们只把这些信息分别定义为独立的简单变量,就体现不出它们之间的相互关联了。所以,应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同的数据项。用“结构体”来定义。,8.1 结构体类型,8.1.2 结构体的定义结构体既然是一种数据类型,在使用
3、前,先要“定义”出要使用的结构体类型。例:将通讯录定义成一个结构体。通讯录的信息由六项属性组成,首先要给这个结构体类型定义取一个名字,比如“AddressList”。然后,应该在结构体定义中对各属性进行说明。下面就是“通讯录”结构体类型:struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/;,8.1 结构体类型,其中,“struct”是关键字,是结构体的标识符,不能省略。“AddressLis
4、t”是结构体类型名,它由我们自己进行命名的。“”中是结构体的成员,每个成员的数据类型既可以是简单的数据类型,也可以是复杂的数据类型,当然也可以是其他结构体数据类型。最后,定义完一个结构体后一定要用一个分号“;”结束。从上面这个例子,可以看出结构体定义格式如下:,8.1 结构体类型,struct 名字 成员说明1;成员说明2;成员说明3;成员说明n;;,可以定义许多复杂的数据类型。比如,定义一个表示日期的结构体:struct dateint year;/*年*/int month;/*月*/int day;/*日*/;用日期这种结构体,我们就可以表示生日、开学时间、春节等等这样的日期。,8.1
5、结构体类型,也可把两种结构体类型结合起来,“造出”更复杂的结构体。比如,一个通讯录的结构体中包含了表示出生日期的结构体struct date:struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/struct date birthday;/*出生日期*/;,8.1 结构体类型,我们先“造出”一个日期的结构体类型,同时我们又在通讯录这个结构体中,将出生日期这个成员变量定义为日期类型,这样通讯录结构
6、体就变成更复杂一些的数据类型了。这样的结构可以叫做嵌套型的结构体,其结构可以如图8-1示意:图8-1 嵌套型的结构体示意,8.1 结构体类型,8.1.3 定义结构体变量既然我们定义的结构体是一种数据类型,就可以像int、char、float这样的数据类型一样来使用,定义结构体类型的变量。用结构体类型定义变量的方式有如下几种:1.先定义结构体类型,再定义变量例,定义一个通讯录结构体:struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件
7、*/char addr30;/*地址*/;/*定义2个结构体变量*/struct AddressList AddressList1,AddressList2;,8.1 结构体类型,定义了两个“AddressList”结构体类型的变量AddressList1和AddressList2。它们可以分别表示两个人的通讯录,比如:AddressList1:AddressList2:图8-2 结构体变量,8.1 结构体类型,结构体变量中的各个成员,在内存中是顺序存放的。各成员变量所占内存的大小是根据定义时它们的数据类型来决定。为了方便,也可以这样定义结构体变量:#define ADDRESSLIST st
8、ruct AddressListADDRESSLISTchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/;ADDRESSLIST AddressList1,AddressList2;,8.1 结构体类型,定义的这个符号常量“ADDRESSLIST”,它就代表了结构体类型“struct AddressList”。这样,在未来的程序设计中,“ADDRESSLIST”可以和“struct AddressList”完全等效使用了。2.
9、在定义结构体类型的同时声明变量struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/AddressList1,AddressList2;,8.1 结构体类型,这种方式和前面定义的方式效果一样,在定义结构体的同时,定义了2个struct AddressList类型的变量AddressList1,AddressList2。这种方式通常用于函数中使用的局部结构体变量。3.直接定义变量还可以用下面的方式
10、直接定义结构体变量:struct/*省略结构体名称*/char name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/AddressList1,AddressList2;,8.1 结构体类型,这种方式没有给出结构体名,通常也用于函数中使用的局部结构体变量。注意:1)对于结构体变量,在定义时,一定要先定义一个结构体类型,然后再定义该类型的变量。只能对结构体变量赋值、存取或运算,但不能对一个结构体类型进行这些操作;2)对结构体中的组成成员,可以
11、单独使用,它的作用相当于普通变量。4.类型定义typedef在编写程序的过程中,为了便于修改和表达清晰,我们往往还可以给数据类型取别名,在C+语言中叫做类型定义。类型定义的关键字是typedef,其使用格式为:,8.1 结构体类型,typedef 数据类型标识符 别名;,比如我们给整型标识符int取个别名,叫做Integer,可以这样写:typedef int Integer;Integer k;这样定义的变量k就是一个整型数。,8.1 结构体类型,同样可以对一个结构体进行类型定义,也就是给这个结构体取个别名。比如给前面定义的通讯录取个别名,并用别名定义变量:typedef struct Ad
12、dressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/ADDR_LIST;/*定义2个struct AddressList类型的变量*/ADDR_LIST AddressList1,AddressList2;,或者:struct AddressListtypedef struct AddressList ADDR_LIST;也可省略结构体的名称AddressList,写成如下的形式:typedef structA
13、DDR_LIST;,8.1 结构体类型,8.1.4 结构体变量的初始化1.结构体整体初始化声明一个结构体变量时,可以对它进行初始化,这和初始化一个数组是类似的。结合上面定义的通讯录结构体类型struct AddressList,我们定义了一个struct AddressList变量one,并对它进行初始化:struct AddressList one=李明,01062548445,M,16,北京;,8.1 结构体类型,注意:不能在定义结构体类型的时候,进行赋初值。例如:struct AddressList/*下面的做法就是错误的*/char name=Li Lin;char telephone
14、12=010-62281234;char sex=M;int age=18;char e_mail40=;char addr30=123 Bejing Road;one;,例8.1 定义一个结构体变量,并进行整体初始化,再输出其结果内容。程序清单 C08_01.cpp#include/*结构体定义部分*/struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/;,8.1 结构体类型,void ma
15、in()/*定义并初始化结构体变量*/struct AddressList one=李明,01062548445,M,16,北京;/*结构体变量的输出*/cout 我们定义并初始化的结构体是:n endl;cout 姓名是:one.name endl 电话号码是:one.telephone endl;cout 性别是:one.sex endlcout 所在城市是:one.addr endl;,8.1 结构体类型,输出结果:我们定义并初始化的结构体是:姓名是:李明电话号码是:01062548445性别是:M年龄是:16E-mail地址是:所在城市是:北京其中的“one.name”、“one.te
16、lephone”是通过“.”运算符访问结构体变量的成员。一般情况下,不能将一个结构体变量作为整体来使用,只能使用其中的成员(分量)。使用结构体成员的方式:,8.1 结构体类型,结构体变量名.成员名,通过这种方式,我们就可以使用结构体变量one中的成员了。例:cout one.name,one.telephone,one.sex,one.age,one.e_mail,one.addr;注意,成员“.”操作符左边必须是结构体变量名,右边必须是结构体中已定义的成员名。下面这些写法都是错误的:strcpy(AddressList.name,wangli);/*AddressList是结构体类型名,不是
17、结构体变量*/one.book=6;/*结构体AddressList中没有定义“book”这个成员*/,8.1 结构体类型,2.初始化结构体部分成员既然,结构体变量的成员可以通过“.”操作符来访问,我们就可以使用赋值语句对它们进行初始化了。例如,对于上面例8.1,对变量one的初始化,还可以使用赋值语句完成:strcpy(one.name,李明);strcpy(one.telephone,01062548445);one.sex=M;one.age=16;strcpy(one.e_mail,);strcpy(one.addr,北京);使用这种方式,比起第一种初始化方式要灵活一下,一般适用于对结
18、构体的某个成员变量进行设置时使用。当然,使用输入语句也可以实现部分结构体成员的初始化。例如:cin one.age;,8.1 结构体类型,3.逐级访问成员在前面曾经定义了包含生日的通讯录结构体,生日这个成员变量又是日期结构体类型。对于生日这个成员变量,我们可以一级一级访问其成员。例如:AddressList1.birthday.month=9;AddressList1.birthday.day=20;AddressList1.birthday.year=1994;,8.1 结构体类型,4.把结构体变量当作整体赋值只有在以下两种情况下,才可以把结构体变量作为一个整体来赋值和访问。1)结构体变量整
19、体赋值例:AddressList2=AddressList1;通过这种模式,可以直接完成结构体之间的赋值。2)取结构体变量地址例如:cout AddressList1.telephone;/*输入AddressList1的电话*/需要注意,不能把结构体变量整体输入进来。例如:cin AddressList1;我们在使用结构体变量时,通常把结构体变量的地址用作函数的参数,以实现传地址调用。,8.1 结构体类型,8.1.5 结构体数组我们知道,一个结构体变量可以存放一组相关的数据(例如,一个通讯录可以存放一个人的姓名、电话、性别、年龄、E-mail和地址等信息),正如前面引入数组一样,我们也可以定
20、义一个数组,其每一成员都是一个结构体,它们都分别包含多个成员变量。1.结构体数组的定义我们在定义结构体数组之前,首先要进行结构体类型的定义。然后再像以前介绍过的数组定义方式定义结构体数组。,8.1 结构体类型,例如,我们定义一个具有3个元素的通讯录结构体数组:/*定义结构体类型*/typedef struct AddressListchar name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/char addr30;/*地址*/ADDR_LIST;/*定义结构体数组*/AD
21、DR_LIST addlist3;/*定义有3个元素的结构体数组*/这样就定义了一个具有3个元素的结构体数组,这些数组元素在内存中是连续存放的。,8.1 结构体类型,2.结构体数组的初始化我们可以把结构体初始化和数组元素初始化结合起来,对结构体数组进行初始化。经过初始化,就可以分别输出结构体数组元素的值。例8.2 结构体数组的初始化。程序清单 C08_02.cpp#include typedef struct char name20;/*姓名*/char telephone12;/*电话*/char sex;/*性别*/int age;/*年龄*/char e_mail40;/*电子邮件*/c
22、har addr30;/*地址*/ADDR_LIST;,8.1 结构体类型,void Print(ADDR_LIST*,int Count);void main()/*定义并初始化结构体变量*/ADDR_LIST addrlist3=李明,01062548445,M,16,北京,王芳,02162281234,F,20,上海,Marry,02786614571,F,19,武汉,;Print(addrlist,3);,8.1 结构体类型,void Print(ADDR_LIST*List,int Count)int i;/*结构体变量的输出*/cout 我们定义并初始化的结构体数组的数据如下:nn
23、;for(i=0;i Count;i+)cout 第 i+1 个记录:endl;cout 姓名:Listi.name endl;cout 电话号码:Listi.telephone endl;cout 性别:Listi.sex endl;cout 年龄:Listi.age endl;cout E-mail:Listi.e_mail endl;cout 所在城市:Listi.addr endl;cout endl;,8.1 结构体类型,输出结果我们定义并初始化的结构体数组的数据如下:第1个记录:姓名:李明电话号码:01062548445 性别:M 年龄:16 E-mail:所在城市:北京第2个记录
24、:姓名:王芳电话号码:02162281234 性别:F 年龄:20 E-mail:所在城市:上海,8.1 结构体类型,第3个记录:姓名:Marry电话号码:02786614571 性别:F 年龄:19 E-mail:所在城市:武汉,8.1 结构体类型,8.1.6 结构体指针结构体指针,就是一个结构体类型的指针,它指向一个结构体变量。这和整型指针、字符指针是一样的。其实例8.2的Print函数中就使用了结构体指针作为形参(*List)。1.结构体指针我们再看一个应用结构体指针的小例子。例8.3 我们定义一个表示某人生日的结构体变量,同时定义一个结构体指针指向它,分别通过结构体变量和结构体指针输出
25、结构体成员的值,观察其结果的不同。,8.1 结构体类型,程序清单 C08_03.cpp/*结构体变量和结构体指针的关系*/#include/*结构体类型定义,其中结构体date是结构体PERSON的成员变量*/struct dateint month;/*表示月,从112*/int day;/*表示日期,从131*/int year;/*表示年*/;/*定义结构体类型,并且是复合(成员变量是结构体类型)类型*/typedef structint No;/*序号*/char name20;/*姓名*/struct date birthday;/*出生日期*/PERSON;,8.1 结构体类型,v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 08 结构 枚举 类型
链接地址:https://www.31ppt.com/p-4875114.html