C语言第九章06.ppt





《C语言第九章06.ppt》由会员分享,可在线阅读,更多相关《C语言第九章06.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第九章第九章 结构体数据类型与链表结构体数据类型与链表9-1 9-1 结构体类型的定义结构体类型的定义 一、结构体类型的定义、初始化与使用一、结构体类型的定义、初始化与使用 迄今为止,已介绍了基本类型(或称简单类型)迄今为止,已介绍了基本类型(或称简单类型)的变量(如整型、实型、字符型变量等),也介绍的变量(如整型、实型、字符型变量等),也介绍了一种构造类型数据了一种构造类型数据数组,数组中的各元素是数组,数组中的各元素是属于同一个类型的。属于同一个类型的。但但是是只只有有这这些些数数据据型型是是不不够够的的。有有时时需需要要将将不不同同类类型型的的数数据据组组合合成成一一个个有有机机的的整整
2、体体,以以便便于于引引用用。这这些些组组合合在在一一个个整整体体中中的的数数据据是是互互相相联联系系的的。例例如如,一一个个学学生生的的学学号号、姓姓名名、性性别别、年年龄龄、成成绩绩、家家庭庭地址等项,这些项都与某一学生相联系。地址等项,这些项都与某一学生相联系。如下图如下图9-19-1所示表格。所示表格。num name sex age score num name sex age score addraddr 10010 Li 10010 Li Fei Fei M 18 87.5 BeijingM 18 87.5 Beijing 图图 9-1 9-1 从上图表格中可以看到性别(从上图表格
3、中可以看到性别(sexsex)、)、年龄年龄(ageage)、)、成绩(成绩(scorescore)、)、地址(地址(addraddr)是属于是属于学号为学号为1001010010和名为和名为“Li Li FeiFei”的学生的。如果将的学生的。如果将numnum、namename、sexsex、ageage、scorescore、addraddr分别定义为分别定义为互相独立的简单变量,是难以反映它们之间的内互相独立的简单变量,是难以反映它们之间的内在联系的。应当把它们组织成一个组合项,在一在联系的。应当把它们组织成一个组合项,在一个组合项中包含若干个类型不同(当然也可以相个组合项中包含若干个
4、类型不同(当然也可以相同)的数据项。同)的数据项。C C语言提供了这样一种数据结构,它称为结构体语言提供了这样一种数据结构,它称为结构体(structurestructure)。)。它相当于其它高级语言中的它相当于其它高级语言中的“记录记录”,它可以,它可以将不同数据类型、但相互关联的将不同数据类型、但相互关联的一组数据,组合成一个有机整体来使用。一组数据,组合成一个有机整体来使用。例如:例如:struct struct student student int int num;num;char name20 char name20;char sex;char sex;int int ageag
5、e;float score float score;char char addraddr3030;;上面定义了一个结构体类型,上面定义了一个结构体类型,struct struct studentstudent(structstruct是关键字,不能省略),是关键字,不能省略),表示这是一个表示这是一个“结构体类型结构体类型”。它包括。它包括numnum、namename、ageage、scorescore、addraddr等不同类型的数等不同类型的数据项。应当注意:据项。应当注意:struct struct studentstudent是程是程序设计者自己定义的类型名。它和系统已序设计者自己定
6、义的类型名。它和系统已定义了的标准类型(如定义了的标准类型(如intint、charchar、floatfloat、doubledouble等)一样可以用来作为定义变量的等)一样可以用来作为定义变量的类型。类型。定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct struct 结构体名结构体名 成员表列成员表列;花括弧内是该结构体中的各个成员(或称分量),花括弧内是该结构体中的各个成员(或称分量),由它们组成一个结构体。例如,上例中的由它们组成一个结构体。例如,上例中的numnum、namename、sexsex等都是成员。对各成员都应进行类型说明,等都是成员。对各成
7、员都应进行类型说明,即:即:类型标识符类型标识符 成员名成员名 也可以把也可以把“成员表列成员表列”称为称为“域表域表”。每一个。每一个成员称为结构体中的一个域。成员名命名规则与普成员称为结构体中的一个域。成员名命名规则与普通变量名的命名规则相同。通变量名的命名规则相同。“结构体结构体”这个词是根这个词是根据英文单词据英文单词structurestructure译出的。许多译出的。许多C C语言书把语言书把structurestructure直译为直译为“结构结构”。但译作。但译作“结构结构”会与一会与一般含义上的般含义上的“结构结构”混淆混淆(例如,数据结构、程序结例如,数据结构、程序结构构
8、)。若把。若把structurestructure译作译作“结构体结构体”或或“构造体构造体”,比译作,比译作“结构结构”确切一些,不致与一般含义上的确切一些,不致与一般含义上的“结构结构”混淆。混淆。二、二、结构类型定义结构类型定义 结构类型的定义确立了结构类型变量的格式。结构类型的定义确立了结构类型变量的格式。在一个结构类型中,不同数据类型组合的数据互在一个结构类型中,不同数据类型组合的数据互相有联系。相有联系。定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct 结构类型名结构类型名 /*struct是结构类型关键字是结构类型关键字*/数据类型数据类型 数据项数据
9、项1;数据类型数据类型 数据项数据项2;数据类型数据类型 数据项数据项;/*此行分号不能少!此行分号不能少!*/通过教材通过教材P171页范例进一步了解结构类型定义页范例进一步了解结构类型定义的格式。的格式。例例9-1 定义一个反映学生基本情况的结构类型,定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。用以存储学生的相关信息。/*功能:定义一个反映学生基本情况的结构类型功能:定义一个反映学生基本情况的结构类型*/*日期结构类型:由年、月、日三项组成日期结构类型:由年、月、日三项组成*/struct date int year;int month;int day;/*学生信息结构类型
10、:由学号、姓名、性别和生日共学生信息结构类型:由学号、姓名、性别和生日共4项组成项组成*/struct std_info char no7;char name9;char sex3;struct date birthday;/*成绩结构类型:由学号和三门成绩共成绩结构类型:由学号和三门成绩共4项组成项组成*/struct score char no7;int score1;int score2;int score3;三、说明三、说明“结结构构类类型型名名”和和“数数据据项项”的的命命名名规规则则,与与变变量量名相同。名相同。数数据据类类型型相相同同的的数数据据项项,既既可可逐逐个个、逐逐行行分
11、分别别定定义,也可合并成一行定义。义,也可合并成一行定义。例如,例例如,例7-1中的日期结构类型,也可改为如下形式:中的日期结构类型,也可改为如下形式:struct date int year,month,day;结结构构类类型型中中的的数数据据项项,既既可可以以是是基基本本数数据据类类型型,也允许是另一个已经定义的结构类型。也允许是另一个已经定义的结构类型。例例如如,例例9-1中中的的结结构构类类型型std_info,其其数数据据项项“birthday”就是一个已经定义的日期结构类型就是一个已经定义的日期结构类型date。C语语言言中中将将个个数数据据项项称称为为结结构构类类型型的的个个成成
12、员员(或分量)。(或分量)。9-2 9-2 结构体类型的定义结构体类型的定义一、结构体类型变量的定义一、结构体类型变量的定义 在在定定义义了了一一个个结结构构类类型型后后,还还需需要要对对相相应应的的变变量量进进行行定定义义,即即定定义义结结构构体体变变量量。结结构构体体变变量量就就是是结结构构体体组组合合数数据据的的标标识识符符,在在程程序序中中用用于于标标识识一一个个结结构构体体,如如定定义了结构体类型后,就可以接着定义该类型的变量。义了结构体类型后,就可以接着定义该类型的变量。要定义一个结构体类型的变量,可以采取以下三种方法。要定义一个结构体类型的变量,可以采取以下三种方法。1.1.先定
13、义结构体类型再定义变量名先定义结构体类型再定义变量名 先定义结构类型再定义其结构变量的一般先定义结构类型再定义其结构变量的一般格式如下:格式如下:struct 结构体名结构体名 成员表列成员表列 ;struct 结构体名结构体名 结构变量表;结构变量表;例如:例如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;struct stustruct stu s1,s2;s1,s2;定义变量后,系统编译时,分配存储空间,例定义变量后,系统编
14、译时,分配存储空间,例s1s1如下如下::变量名变量名 占内存字节数占内存字节数 no no 4 4 name20 20 name20 20 sex 1 sex 1 score3 12 score3 12注注意意:s1s1变变量量成成员员是是不不同同数数据据类类型型连连续续存存储储,但但s1s1、s2s2不一定是连续存储。不一定是连续存储。应应当当注注意意:将将一一个个变变量量定定义义为为标标准准类类型型(基基本本数数据据类类型型)与与定定义义为为结结构构体体类类型型不不同同之之处处在在于于:后后者者不不仅仅要要求求指指定定变变量量为为结结构构体体类类型型,而而且且要要求求指指定定为为某某一一
15、特特定定的的结结构构体体类类型型(例例如如,struct struct stustu),),不不能能只只指指定定为为“structstruct型型”而而不不指指定定结结构构体体名名。即即定定义义结结构变量时必须同时指定结构类型和结构名。构变量时必须同时指定结构类型和结构名。而在定义变量为整型时,只需指定为而在定义变量为整型时,只需指定为intint型即可。型即可。换句话说,可以定义许多种具体的结构体类型。换句话说,可以定义许多种具体的结构体类型。为了使用方便,人们通常用一个符号常量代表为了使用方便,人们通常用一个符号常量代表一个结构体类型。在程序开头,用一个结构体类型。在程序开头,用 defi
16、ne STUDENTdefine STUDENT struct struct stustu 这样在程序中,这样在程序中,STUDENTSTUDENT 与与 struct stustruct stu完全等完全等效。效。这时的结构类型定义可以改写为:这时的结构类型定义可以改写为:STUDENTSTUDENT long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;然后可以直接用然后可以直接用STUDENTSTUDENT定义变量。如定义变量。如:STUDENT STUDENT s1,s2;
17、s1,s2;用这种方法定义变量和用用这种方法定义变量和用intint、floatfloat定义变量定义变量的形式相仿,不必再写关键字的形式相仿,不必再写关键字structstruct。如果程序如果程序规模比较大,往往将对结构体类型的定义集中放规模比较大,往往将对结构体类型的定义集中放到一个文件到一个文件(以以为后缀的为后缀的“头文件头文件”)中。哪中。哪个个源文件需用到此结构类型则可用源文件需用到此结构类型则可用#includeinclude命令将命令将该头文件包含到本文件中。这样做便于装配,便该头文件包含到本文件中。这样做便于装配,便于修改,便于使用。于修改,便于使用。2.2.在定义类型的同
18、时定义变量在定义类型的同时定义变量 同同时时定定义义结结构构类类型型及及其其结结构构变变量量的的一一般般格格式式如如下:下:struct 结构体名结构体名 成员表列成员表列 结构变量表;结构变量表;例如:例如:struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score2;float score2;s1,s2;s1,s2;它的作用与前面定义的相同。既定义了一个它的作用与前面定义的相同。既定义了一个结构体类型结构体类型struct stustruct stu,又定义了两个又定义
19、了两个struct struct stustu类型的变量类型的变量s1,s2s1,s2。3.3.直接定义结构类型变量直接定义结构类型变量 其一般形式为:其一般形式为:其一般形式为:其一般形式为:structstruct 成员表列成员表列 变量名表列;变量名表列;即不出现结构体名。即不出现结构体名。关于结构体类型,有几点说明:关于结构体类型,有几点说明:1)结构类型与结构变量是两个不同的概念,其)结构类型与结构变量是两个不同的概念,其区别如同区别如同int类型与类型与int型变量的区别一样。型变量的区别一样。对结构对结构体变量来说,在定义时一般先定义一个结构体类型,体变量来说,在定义时一般先定义
20、一个结构体类型,然后定义变量为该类型。只能对变量赋值、存取或然后定义变量为该类型。只能对变量赋值、存取或运算,而不能对一个类型赋值、存取或运算。运算,而不能对一个类型赋值、存取或运算。在在编编译译时时,对对类类型型是是不不分分配配空空间间的的,只只对对变变量量分分配配空间。空间。)对对结结构构体体中中的的成成员员(即即 域域),可可以以单单独独使使用用,它的作用与地位相当于普通变量。它的作用与地位相当于普通变量。3)3)结结构构类类型型中中的的成成员员名名,可可以以与与程程序序中中的的变变量量同同名,它们代表不同的对象,互不干扰。名,它们代表不同的对象,互不干扰。二、结构变量引用规则二、结构变
21、量引用规则 定定义义为为结结构构体体变变量量后后就就可可以以引引用用该该变变量量,但但只只有有引引用用各各成成员员和和访访问问整整个个结结构构体体变变量量。在在访访问问中中应遵守结构变量引用规则。应遵守结构变量引用规则。1.1.成员的访问成员的访问 使用运算符使用运算符“.”“.”访问引用结构体变量成员访问引用结构体变量成员 对于结构变量中各个成员的访问,要通过成员对于结构变量中各个成员的访问,要通过成员运算符运算符“.”,逐个访问其成员,且访问的格式为:,逐个访问其成员,且访问的格式为:结构变量结构变量.成员成员 其其中中的的操操作作符符“.”称称为为成成员员运运算算符符,具具有有最最高高优
22、优先级。先级。C C语言允许直接对结构变量的成员赋值,例如:语言允许直接对结构变量的成员赋值,例如:s1.nos1.no=10010;=10010;在这里把在这里把s1.nos1.no作为一个整体来看待。但不能作为一个整体来看待。但不能将一个结构体变量作为一个整体进行输入和输出。将一个结构体变量作为一个整体进行输入和输出。例如,已定义:例如,已定义:s1s1和和s2s2为结构体变量,并且它们为结构体变量,并且它们已有值。不能这样引用:已有值。不能这样引用:scanfscanf(“%ld,%s,%c,%f%ld,%s,%c,%f”,&s1);,&s1);printf printf(“%ld,%s
23、,%c,%fn%ld,%s,%c,%fn”,s1);,s1);例例9-2 9-2 定义一个结构变量定义一个结构变量s s,先赋值,后输出。先赋值,后输出。#include string.hinclude string.hmain()main()struct stustruct stu long no;long no;char name20;char name20;char sex;char sex;float score3;float score3;s;s;s.no=1001;s.no=1001;strcpystrcpy(s.name,(s.name,”Wang PingWang Ping”)
24、;);s.sex=f;s.sex=f;s.score0=95;s.score0=95;s.score1=87;s.score1=87;s.score2=85;s.score2=85;printfprintf(%ld%20s%4c%5.1f%5.1f%5.1f,s.no,(%ld%20s%4c%5.1f%5.1f%5.1f,s.no,s.name,s.sex,s.score0,s.score1,s.name,s.sex,s.score0,s.score1,s.score2);s.score2);访问引用整个结构体变量访问引用整个结构体变量例:例:struct stustruct stu s1,s
25、2;s1,s2;s2=s1;s2=s1;2.2.对成员变量可以像普通变量一样进行各种运算对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)(根据其类型决定可以进行的运算)例如:例如:s2.no=s1.no;s2.no=s1.no;sum=stu;s1.no+;s1.no+;+s1.no;+s1.no;注意:由于注意:由于.”运算符的优先级最高,因此运算运算符的优先级最高,因此运算s1.no+s1.no+是对是对s1s1中的中的nono进行自加运算,而不是先对进行自加运算,而不是先对s1s1进行自加运算。进行自加运算。3.3.可可以以引引用用结结构构变变量量成成员员的的地地
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 第九 06

限制150内