第七章结构与联合_第1页
第七章结构与联合_第2页
第七章结构与联合_第3页
第七章结构与联合_第4页
第七章结构与联合_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七章结构与联合2005年3月1第一页,共四十六页,编辑于2023年,星期四本章主要内容本章主要内容包括:结构体的概念结构体类型变量的定义方法结构体类型变量的使用形式和初始化结构体数组结构体与函数联合体2005年3月2第二页,共四十六页,编辑于2023年,星期四引言

在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据——结构体(structure),简称结构。

结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。 同时也介绍在相同存储区域内存储不同数据类型的构造类型――共用体(也称联合体)的相关概念。

2005年3月3第三页,共四十六页,编辑于2023年,星期四7.1结构体的概念(续)

结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项(当然也可以相同),从而使这些数据项组合起来反映某一个信息。

结构体相当于COBOL和PASCAL等高级语言中的“记录”。 例如,可以定义一个职工worker结构体,在这个结构体中包括职工编号、姓名、性别、年龄、工资、家庭住址、联系电话。这样就可以用一个结构体数据类型的变量来存放某个职工的所有相关信息。并且,用户自定义的数据类型worker也可以与int、double等基本数据类型一样,用来作为定义其他变量的数据类型。2005年3月4第四页,共四十六页,编辑于2023年,星期四7.1结构体的概念(续)定义一个结构体类型的一般形式为:struct结构体名{数据类型成员名1;数据类型成员名2;:数据类型成员名n;};

用分号“;”作为结束符。整个结构的定义也用分号作为结束符。

“成员表列”或“域表”命名规则与变量名相同基本变量类型和数组类型,也可以是指针类型,或者是一个结构体类型。2005年3月5第五页,共四十六页,编辑于2023年,星期四7.1结构体的概念(续)例如:定义一个职工worker结构体如下:structworker{longnumber;charname[20];charsex; //sex是成员名

intage;floatsalary;charaddress[80];charphone[20];

}; //注意分号不要省略intsex=10;//sex是变量名2005年3月6第六页,共四十六页,编辑于2023年,星期四7.1结构体的概念(续)

结构体类型中的成员名可以与程序中的变量名相同,二者并不代表同一对象,编译程序可以自动对它们进行区分。

最后,总结一下结构体类型的特点: (1)结构体类型是用户自定义构造的。 (2)它由若干不同的基本数据类型的数据构成。 (3)它属于C++语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。2005年3月7第七页,共四十六页,编辑于2023年,星期四7.2结构体类型变量的定义方法 结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下:7.2.1先定义结构体类型再定义变量名 这是C++语言中定义结构体类型变量最常见的方式,一般语法格式如下:struct结构体名{

成员表列;};struct结构体名变量名;2005年3月8第八页,共四十六页,编辑于2023年,星期四7.2.1先定义结构体类型再定义变量(续)例如,定义几个职工变量:structworker{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];};structworkerworker1,worker2;

2005年3月9第九页,共四十六页,编辑于2023年,星期四7.2.1先定义结构体类型再定义变(续) 注意:“structworker”代表类型名,不能分开写为:

structworker1,worker2;

//错误,没有指明是哪种结构体类型或

workerworker1,worker2;

//错误,没有struct关键字

//系统不认为worker是结构体类型

为了使用上的方便,程序员通常用一个符号常量代表一个结构体类型。即在程序开头加上下列语句:

#defineWORKER

structworker;

这样在程序中,WORKER与structworker完全等效。

2005年3月10第十页,共四十六页,编辑于2023年,星期四7.2.1先定义结构体类型再定义变(续)例如:WORKER{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];};WORKERworker1,worker2;此时,可以直接用WORKER定义worker1、worker2两个变量,而不必再写关键字struct。2005年3月11第十一页,共四十六页,编辑于2023年,星期四7.2.2在定义类型的同时定义变量

如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件(以.h为后缀)中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于程序的修改和使用。

这种形式的定义的一般形式为:

struct结构体名

{

成员表列;

}变量名;

2005年3月12第十二页,共四十六页,编辑于2023年,星期四7.2.2在定义类型的同时定义变量(续)例如:structworker{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];}worker1,worker2;此例与前例作用相同,都定义了两个变worker1、worker2,它们是结构体类型structworker。

2005年3月13第十三页,共四十六页,编辑于2023年,星期四7.2.3直接定义结构类型变量其一般形式为:struct//没有结构体名{

成员表列}变量名;

2005年3月14第十四页,共四十六页,编辑于2023年,星期四7.2.3直接定义结构类型变量(续)例如:struct{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];}worker1,worker2;2005年3月15第十五页,共四十六页,编辑于2023年,星期四7.2.3直接定义结构类型变量(续)

一个结构体变量占用内存的实际大小,也可以利用sizeof运算求出。它的运算表达式为:

sizeof(运算量)

//求出给定的运算量占用内存空间的字节数 其中运算量可以是变量、数组或结构体变量,也可以是数据类型的名称。

例如:

sizeof(structworker) sizeof(worker1)2005年3月16第十六页,共四十六页,编辑于2023年,星期四7.3结构体变量的使用形式和初始化7.3.1结构体变量的使用形式 在定义了结构体变量以后,就可以使用这个变量。结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员项数据。 结构体变量的成员用以下一般形式表示:

结构体变量名.成员名 例如,上节给出的结构体变量worker1具有下列七个成员:

worker1.number;;worker1.sex;

worker1.age;worker1.salary;worker1.address;

worker1.phone

2005年3月17第十七页,共四十六页,编辑于2023年,星期四7.3.1结构体变量的使用形式(续)

在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如:

strcpy(,”ZhangSan”); worker1.age=26; strcpy(worker1.phone,”1234567”); worker1.sex=’m’; : :

除此之外,还可以引用结构体变量成员的地址以及成员中的元素。例如:引用结构体变量成员的首地址&;引用结构体变量成员的第二个字符[1];引用结构体变量的首地址&worker1。

2005年3月18第十八页,共四十六页,编辑于2023年,星期四7.3.1结构体变量的使用形式(续)

在使用结构体类型变量时有以下几点需要加以注意: (1)不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体类型变量中的各个成员分别引用。 例如,对上面定义的结构体类型变量wan,下列引用都是错误的:

cout<<wan; cin>>wan;

但是可以如下引用:

cout<<; cin>>;

2005年3月19第十九页,共四十六页,编辑于2023年,星期四7.3.1结构体变量的使用形式(续) (2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型变量worker1,可以这样访问各成员:

worker1.age

worker1.birthday.year worker1.birthday.month worker1.birthday.day

注意:不能用worker1.birthday来访问worker1变量中的成员birthday,因为birthday本身是一个结构体变量。

2005年3月20第二十页,共四十六页,编辑于2023年,星期四7.3.1结构体变量的使用形式(续)

(3)对成员变量可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。例如:

worker2.age=worker1.age; sum=worker1.age+worker2.age; worker1.age++;

(4)在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。

在C++程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。

2005年3月21第二十一页,共四十六页,编辑于2023年,星期四7.3.2结构体变量的初始化与其他类型变量一样,也可以给结构体的每个成员赋初值,这称为结构体的初始化。有两种初始化形式,一种是在定义结构体变量时进行初始化,一般语法格式如下:

struct结构体名变量名={初始数据表}; 另一种是在定义结构体类型时进行结构体变量的初始化。一般语法格式如下:

struct结构体名

{

成员表列;

}变量名={初始数据表};

2005年3月22第二十二页,共四十六页,编辑于2023年,星期四7.3.2结构体变量的初始化(续)

例如,前述student结构体类型的结构体变量wan在说明时可以初始化如下:

structstudentwan={”WanJun”,’m’,20,”SuZhouRoadNo.100”};

它所实现的功能,与下列分别对结构体变量的每个成员赋值所实现的功能相同:

strcpy(,”WanJun”); wan.sex=’m’; wan.age=20; wan.addr=”SuZhouRoadNo.100”;2005年3月23第二十三页,共四十六页,编辑于2023年,星期四7.3.2结构体变量的初始化(续)

与数组的初始化特性相同,结构体的初始化仅限于外部的和static型结构体。也就是说,在函数内部对结构体进行初始化时,必须指定该结构体为static型。对缺省存储类型的auto型结构体不能在函数内部对它们进行初始化。

2005年3月24第二十四页,共四十六页,编辑于2023年,星期四7.4结构体数组 具有相同结构体类型的结构体变量也可以组成数组,称它们为结构体数组。结构体数组的每一个数组元素都是结构体类型的数据,它们都分别包括各个成员(分量)项。7.4.1结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。可以采用三种方法:

2005年3月25第二十五页,共四十六页,编辑于2023年,星期四7.4.1结构体数组的定义1.先定义结构体类型,再用它定义结构体数组。结构体数组的定义形式如下:struct结构体名

{

成员表列;};struct结构体名结构体数组名[n];

例如:structstudent{charname[20];charsex;intage;charaddr[20];};structstudentstu[3];

2005年3月26第二十六页,共四十六页,编辑于2023年,星期四7.4.1结构体数组的定义(续)2.在定义结构体类型同时定义结构体数组。结构体数组的定义形式如下:struct结构体名

{

成员表列;}数组名[元素个数];例如:structstudent{charname[20];charsex;intage;charaddr[20];}stu[3];

2005年3月27第二十七页,共四十六页,编辑于2023年,星期四7.4.1结构体数组的定义(续)3.直接定义结构体数组结构体数组的定义形式如下:struct//没有结构体名{

成员表列;

}数组名[元素个数];

例如:struct{charname[20];charsex;intage;charaddr[20];}stu[3];

2005年3月28第二十八页,共四十六页,编辑于2023年,星期四7.4.1结构体数组的定义(续)

结构体数组名表示该结构体数组的存储首地址。 结构体数组适合于处理由若干具有相同关系的数据组成的数据集合体。用结构体数组处理数据时可以使用循环,从而使程序十分简炼。2005年3月29第二十九页,共四十六页,编辑于2023年,星期四7.4.2结构体数组的初始化

结构体数组在定义的同时也可以进行初始化,并且与结构体变量的初始化规定相同,只能对全局的或静态存储类别的结构体数组初始化。 结构体数组初始化的一般形式是:struct结构体名{

成员表列;};struct结构体名

数组名[元素个数]={初始数据表};2005年3月30第三十页,共四十六页,编辑于2023年,星期四7.4.2结构体数组的初始化(续)或者:struct结构体名{

成员表列;}数组名[元素个数]={初始数据表};

在对结构体数组进行初始化时,方括号[]中元素个数可以不指定。编译时,系统会根据给出初始的结构体常量的个数来确定数组元素的个数。 由于结构体变量是由若干不同类型的数据组成,而结构体数组又是由若干结构体变量组成。所以要特别注意包围在大括号中的初始数据的顺序,以及它们与各个成员项间的对应关系。2005年3月31第三十一页,共四十六页,编辑于2023年,星期四7.4.3结构体数组的使用(续)

一个结构体数组的元素相当于一个结构体变量,因此前面介绍的有关结构体变量的规则也适应于结构体数组元素。以上面定义的结构体数组stu[3]为例说明对结构体数组的引用: (1)引用某一元素中的成员。 若要引用数组第二个元素的name成员,则可写为:

stu[1].name

若数组已如前所示进行了初始化,则stu[1].name的值为“LiuYong”。2005年3月32第三十二页,共四十六页,编辑于2023年,星期四7.4.3结构体数组的使用(续)

(2)可以将一个结构体数组元素值赋给同一结构体类型的数组中的另一个元素,或赋给同一类型的变量。如:

structstudentstu[3],student1;

现在定义了一个结构体类型的数组,它有3个元素,又定义了一个结构体类型变量student1,则下面的赋值是合法的。

student1=stu[0]; stu[0]=stu[1];

stu[1]=student1;

2005年3月33第三十三页,共四十六页,编辑于2023年,星期四7.4.3结构体数组的使用(续)

(3)不能把结构体数组元素作为一个整体直接进行输入输出。如:

cout<<stu[0];或

cin>>stu[0];

都是错误的。

只能以单个成员为对象进行输入输出,如:

cin>>stu[0].name; cin>>stu[1].num; cout<<stu[0].name;

cout<<stu[1].num;

2005年3月34第三十四页,共四十六页,编辑于2023年,星期四7.5结构体与函数

在调用函数时,可以把结构体变量的值作为参数传递给函数。由于结构体是多个数据的集合体,当把它们传递给函数时,C++的编译系统不允许把结构体变量整体作为一个参数传递到函数中去。因此,只能把每个结构体变量的成员作为一个个的参数传递到函数中去。

例如,用stu[1].name或stu[2].age作函数实参,将实参值传给形参。这种用法和用普通变量作实参是一样的,属“值传递”方式。这种方式一般不常用。

2005年3月35第三十五页,共四十六页,编辑于2023年,星期四7.5结构体与函数(续)一种常用的方式是,与数组在函数间传递一样,结构体传递给函数时,一般采用地址传递方式,即把结构体变量(或数组)的存储地址作为参数向函数传递,函数中用指向相同结构体类型的指针接收该地址值。然后,在函数中通过这个结构体指针来处理结构体变量(或数组)中的各项数据。2005年3月36第三十六页,共四十六页,编辑于2023年,星期四7.5结构体与函数(续)7.6.1传递结构值 结构体可以按值传递,这种情况下整个结构值都将被复制到形参中去。

7.6.2传递结构体的引用 结构体也可以引用传递,这种情况下仅仅把结构体变量地址传递给形参。引用传递效率较高,因为它不用传递整个结构体变量的值,节省了传递的时间和空间。7.6.3传递结构体的指针 结构体变量(或数组)的值也可以通过结构体指针传递,但程序的可读性比引用传递要差一些。

2005年3月37第三十七页,共四十六页,编辑于2023年,星期四7.6共用体7.6.1共用体的概念 在C++语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。

定义一个共用体类型的一般形式为:

union共用体名

{

成员表列;

};

2005年3月38第三十八页,共四十六页,编辑于2023年,星期四7.6.1共用体的概念例如:

uniongy { inti; charc; floatf; };

就定义了一个共用体类型uniongy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。如上述共用体类型uniongy的变量占用4个字节的内存。2005年3月39第三十九页,共四十六页,编辑于2023年,星期四7.6.1共用体的概念(续)

在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。 例如,定义了一个结构体类型:

structgy { inti; charc; floatf; };

则结构体类型structgy的变量占用的内存为2+1+4=7个字节。2005年3月40第四十页,共四十六页,编辑于2023年,星期四7.6.1共用体的概念(续) 定义共用体类型变量的方法与定义结构体类型变量的方法相似,也有三种方法:1、union共用体名

{

成员表列;

}变量表列; 例如:

uniongy { inti; charc; floatf; }a,b,c;2005年3月41第四十一页,共四十六页,编辑于2023年,星期四7.6.1共用体的概念(续)2、将共用体类型定义与共用体变量定义分开:uniongy{inti; charc; floatf;};uniongya,b,c;3、直接定义共用体变量:union{inti; charc; floatf;}a,b,c;上面几种方法都是定义了一个共用体类型

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论