C语言2_6

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C++程序设计第二章C++编程基础(六)2.6结构体与公用体•结构体的概念及结构体类型的定义方法•结构体类型变量的定义方法•结构体变量的使用形式和初始化•结构体数组•结构体与指针•结构体与函数•公用体2.6.1结构体的概念及结构体类型的定义方法1、概念•在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据——结构体(structure),简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。•同时也介绍在相同存储区域内存储不同数据类型的构造类型—共用体(也称联合体)的相关概念。•结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项(当然也可以相同),从而使这些数据项组合起来反映某一个信息。结构体相当于COBOL和PASCAL等高级语言中的“记录”。•例如,可以定义一个student结构体,在这个结构体中包括学号、姓名、性别、年龄、、家庭住址、联系电话,电子邮件地址等。这样就可以用一个结构体数据类型的变量来存放某个学生的所有相关信息。并且,用户自定义的数据类型student也可以与int、double等基本数据类型一样,用来作为定义其他变量的数据类型。2、结构体类型的定义方法struct结构体名{数据类型成员名1;数据类型成员名2;:数据类型成员名n;};•在大括号中的内容也称为“成员列表”或“域表”。其中,每个成员名的命名规则与变量名相同;数据类型可以是基本变量类型和数组类型,也可以是指针变量类型,或者是一个结构体类型;用分号“;”作为结束符。整个结构的定义也用分号作为结束符,例如:定义一个学生的结构体类型structstudent{longnumber;charname[20];charsex;intage;charaddress[80];charemail[20];};说明:(1)结构体类型中的成员名可以与程序中的变量名相同,二者并不代表同一对象,编译程序可以自动对它们进行区分。(2)结构体类型是用户自己构造的。(3)它由若干不同的基本数据类型的数据构成。(4)它属于C++语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。2.6.2结构体类型变量的定义方法•结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下。1、先定义结构体类型再定义变量名•这是C++语言中定义结构体类型变量最常见的方式,一般语法格式如下:struct结构体名{成员列表;};结构体名变量名;例如:定义几个学生变量structstudent{longnumber;charname[20];charsex;intage;charaddress[80];charemail[20];};studentstu1,stu2,stu3•如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件(以.h为后缀)中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于程序的修改和使用。2、在定义类型的同时定义变量格式:struct结构体名{成员列表;}变量;例:struct{longnumber;charname[20];charsex;intage;charaddress[80];charemail[20];}stu1,stu2,stu3;3、直接定义结构类型变量struct//没有结构体名{成员列表}变量名;例如:struct{longnumber;charname[20];charsex;intage;charaddress[80];charemail[20];}stu1,stu2,stu32.6.3结构体变量的使用形式和初始化1、结构体变量的使用形式•在定义了结构体变量以后,就可以使用这个变量。结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员项数据。•结构体变量的成员用以下一般形式表示:结构体变量名.成员名例:•结构体类型变量stu1各个成员的表示为:stu1.numberstu1.namestu1.sexstu1.agestu1.addressstu1.email2、给结构体变量赋值•在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如:strcpy(stu1.name,”ZhangSan”);stu1.age=26;strcpy(stu1.phone,”1234567”);stu1.sex=’m’;::•除此之外,还可以引用结构体变量成员的地址以及成员中的元素。例如:引用结构体变量成员的首地址&stu1.name;引用结构体变量成员的第二个字符stu1.name[1];引用结构体变量的首地址&sdu1。注意:(1)不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体类型变量中的各个成员分别引用。•例如,对上面定义的结构体类型变量stu1,下列引用都是错误的:coutstu1;cinstu1;但是可以如下引用:coutstu1.name;cinstu1.name;(2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型修改为:structstudent{longnumber;charname[20];charsex;structdate{intyear;intmonth;intday;}birthday;charaddress[80];charemail[20];}stu1;•对上面定义的结构体类型变量stu1,可以这样访问其中birthday各成员:stu1.birthday.yearstu1.birthday.monthstu1.birthday.day•注意:不能用stu1.birthday来访问stu1变量中的成员birthday,因为birthday本身是一个结构体变量。(3)对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。(4)在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。在C++程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。3、结构体变量的初始化•与其他类型变量一样,也可以给结构体的每个成员赋初值,这称为结构体的初始化。有两种初始化形式,一种是在定义结构体变量时进行初始化,一般语法格式如下:结构体名变量名={初始数据表};•另一种是在定义结构体类型时进行结构体变量的初始化。一般语法格式如下:struct结构体名{成员列表;}变量名={初始数据表};例如:•前述student结构体类型的结构体变量stu1在定义时可以初始化如下:studentstu1={2004001,”WanJun”,’m’,20,”SuZhouRoadNo.100”,”wangjun@163.com”};•它所实现的功能,与下列分别对结构体变量的每个成员赋值所实现的功能相同:stu1.number=2004001strcpy(stu1.name,”WanJun”);stu1.sex=’m’;stu1.age=20;stu1.addr=”SuZhouRoadNo.100”;stu1.email=“wangjun@163.com”2.6.4结构体数组•具有相同结构体类型的结构体变量也可以组成数组,称它们为结构体数组。结构体数组的每一个数组元素都是结构体类型的数据,它们都分别包括各个成员(分量)项。1、结构体数组的定义•定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。可以采用三种方法:(1)定义结构体类型,再用它定义结构体数组。结构体数组的定义形式如下:struct结构体名{成员列表;};结构体名数组名[元素个数];(2)在定义结构体类型同时定义结构体数组struct结构体名{成员列表;}数组名[元素个数];(3)直接定义结构体数组struct//没有结构体名{成员列表;}数组名[元素个数];例:structstudent{charname[20];charsex;intage;charaddr[20];};studentstu[3];2、结构体数组的初始化•结构体数组在定义的同时也可以进行初始化,并且与结构体变量的初始化规定相同,只能对全局的或静态存储类别的结构体数组初始化。•结构体数组初始化的一般形式是:struct结构体名{成员列表;};结构体名数组名[元素个数]={初始数据表};3、结构体数组的使用•一个结构体数组的元素相当于一个结构体变量,因此前面介绍的有关结构体变量的规则也适应于结构体数组元素。以上面定义的结构体数组stu[3]为例说明对结构体数组的引用:(1)引用某一元素中的成员。•若要引用数组第二个元素的name成员,则可写为:stu[1].name(2)结构体数组元素之间的相互赋值•可以将一个结构体数组元素值赋给同一结构体类型的数组中的另一个元素,或赋给同一类型的变量。如:studentstu[3],student1;•现在定义了一个结构体类型的数组,它有3个元素,又定义了一个结构体类型变量student1,则下面的赋值是合法的。student1=stu[0];stu[0]=stu[1];stu[1]=student1;(3)结构体数组元素的输出•不能把结构体数组元素作为一个整体直接进行输入输出。如:coutstu[0];•或cinstu[0];都是错误的。•只能以单个成员为对象进行输入输出,如:cinstu[0].name;cinstu[1].num;coutstu[0].name;coutstu[1].num;2.6.5结构体与指针•通常把指向结构体变量的指针称为结构体指针,把指向结构体数组或数组元素的指针称为结构体数组指针。1、结构体指针•可以设一个指针变量用来指向一个结构体变量,此时该指针变量的值是结构体变量的起始地址,该指针称为结构体指针。结构体指针与前面介绍的各种指针变量在特性和方法上是相同的。与前述相同,在程序中结构体指针也是通过访问目标运算“*”访问它的目标结构体。结构体指针在程序中的一般定义形式为:结构体名*结构指针名;•其中的结构体名必须是已经定义过的结构体类型。例如:•对于前面定义的结构体类型student,可以说明使用这种结构体类型的结构指针如下:student*pstu;•其中pstu是指向student结构体类型的指针。结构体指针的说明规定了它的数据特性,并为结构体指针本身分配了一定的内存空间。但是指针的内容尚未确定,即它的具体指向是不定的。前面讲过,在程序中注意不要使用不定向的指针。因此,指针在使用之前,必须通过初始化或赋值运算把实际存在的某个结构体变量的存储地址赋于它。这时要求结构体指针与结构体变量必须属于相同的结构体类型。结构体成员的表示方法:•对于结构体指针指向的结构体成员项,表示方法如下:(1)(*结构体指针名).成员名(2)结构体指针名-成员名•例如:studentstu1,*p=&stu1;•则结构体指针p指向的结构体变量中的成员name可以表示如下:(*p).name或p-name•在后种表示方法中,“-”(减号和大于号)也是一种运算符。它在第一运算优先级中。它表示的运算意义是,访问指针指向的结构体变量中的成员。2、结构体数组指针•在C++语言中,把指向结构体数组或数组元素的指针称为结构体数组指针。3、结构体指针数组•在一个数组中,若每个元素都是一个结构体指针,则称为结构体指针数组。2.6.6结构体与

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功