结构与联合正规版资料_第1页
结构与联合正规版资料_第2页
结构与联合正规版资料_第3页
结构与联合正规版资料_第4页
结构与联合正规版资料_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第七章结构(jiégòu)与联合第一页,共46页。2005年3月1本章主要(zhǔyào)内容本章主要(zhǔyào)内容包括:结构体的概念结构体类型变量的定义方法结构体类型变量的使用形式和初始化结构体数组结构体与函数联合体第二页,共46页。2005年3月2引言(yǐnyán) 在实际的处理对象中,有许多信息是由多个(duōɡè)不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据——结构体(structure),简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。 同时也介绍在相同存储区域内存储不同数据类型的构造类型――共用体(也称联合体)的相关概念。第三页,共46页。2005年3月37.1结构(jiégòu)体的概念(续) 结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项(当然也可以相同),从而使这些数据项组合起来反映某一个信息。结构体相当于COBOL和PASCAL等高级语言中的“记录”。 例如,可以定义一个职工worker结构体,在这个结构体中包括职工编号、姓名、性别、年龄、工资、家庭(jiātíng)住址、联系。这样就可以用一个结构体数据类型的变量来存放某个职工的所有相关信息。并且,用户自定义的数据类型worker也可以与int、double等基本数据类型一样,用来作为定义其他变量的数据类型。第四页,共46页。2005年3月47.1结构(jiégòu)体的概念(续)定义一个结构体类型的一般形式为:struct结构体名{数据类型成员(chéngyuán)名1;数据类型成员(chéngyuán)名2;:数据类型成员(chéngyuán)名n;};

用分号“;”作为结束符。整个结构的定义也用分号作为结束符。“成员(chéngyuán)表列”或“域表”命名规则与变量名相同基本变量类型和数组类型,也可以是指针类型,或者是一个结构体类型。第五页,共46页。2005年3月57.1结构(jiégòu)体的概念(续)例如:定义一个(yīɡè)职工worker结构体如下:structworker{longnumber;charname[20];charsex; //sex是成员名intage;floatsalary;charaddress[80];charphone[20];}; //注意分号不要省略intsex=10;//sex是变量名第六页,共46页。2005年3月67.1结构(jiégòu)体的概念(续) 结构体类型中的成员名可以与程序中的变量名相同(xiānɡtónɡ),二者并不代表同一对象,编译程序可以自动对它们进行区分。 最后,总结一下结构体类型的特点: (1)结构体类型是用户自定义构造的。 (2)它由若干不同的基本数据类型的数据构成。 (3)它属于C++语言的一种数据类型,与整型、实型相当。因此,定义它时不分配空间,只有用它定义变量时才分配空间。第七页,共46页。2005年3月7所以要特别注意包围在大括号中的初始数据的顺序,以及它们与各个成员项间的对应关系。floatsalary;数据类型成员(chéngyuán)名1;structstudentstu[3];结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项(当然也可以相同),从而使这些数据项组合起来反映某一个信息。}worker1,worker2;最后,总结一下结构体类型的特点:用结构体数组处理数据时可以使用循环,从而使程序十分简炼。structworkerfloatsalary;例如,对上面定义的结构体类型变量worker1,可以(kěyǐ)这样访问各成员:workerworker1,worker2;2、将共用(ɡònɡyònɡ)体类型定义与共用(ɡònɡyònɡ)体变量定义分开:结构体数组名表示该结构体数组的存储(cúnchǔ)首地址。charphone[20];数据类型成员(chéngyuán)名1;7.2结构(jiégòu)体类型变量的定义方法 结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用(shǐyòng)这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下:7.2.1先定义结构体类型再定义变量名 这是C++语言中定义结构体类型变量最常见的方式,一般语法格式如下:struct结构体名{成员表列;};struct结构体名变量名;第八页,共46页。2005年3月87.2.1先定义结构体类型(lèixíng)再定义变量(续)例如,定义几个职工(zhígōng)变量:structworker{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];};structworkerworker1,worker2;第九页,共46页。2005年3月97.2.1先定义(dìngyì)结构体类型再定义(dìngyì)变(续) 注意:“structworker”代表类型名,不能分开写为:structworker1,worker2;

//错误,没有指明是哪种结构体类型或workerworker1,worker2; //错误,没有struct关键字 //系统不认为worker是结构体类型 为了使用上的方便,程序员通常用一个符号(fúhào)常量代表一个结构体类型。即在程序开头加上下列语句: #defineWORKERstructworker; 这样在程序中,WORKER与structworker完全等效。第十页,共46页。2005年3月107.2.1先定义(dìngyì)结构体类型再定义(dìngyì)变(续)例如:WORKER{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];};WORKERworker1,worker2;此时,可以(kěyǐ)直接用WORKER定义worker1、worker2两个变量,而不必再写关键字struct。第十一页,共46页。2005年3月117.2.2在定义类型(lèixíng)的同时定义变量 如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件(以.h为后缀)中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于(biànyú)程序的修改和使用。 这种形式的定义的一般形式为: struct结构体名 {

成员表列;

}变量名;第十二页,共46页。2005年3月127.2.2在定义类型(lèixíng)的同时定义变量(续)例如:structworker{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];}worker1,worker2;此例与前例(qiánlì)作用相同,都定义了两个变worker1、worker2,它们是结构体类型structworker。第十三页,共46页。2005年3月137.2.3直接定义结构(jiégòu)类型变量其一般形式(xíngshì)为:struct//没有结构体名{成员表列}变量名;第十四页,共46页。2005年3月147.2.3直接(zhíjiē)定义结构类型变量(续)例如(lìrú):struct{longnumber;charname[20];charsex;intage;floatsalary;charaddress[80];charphone[20];}worker1,worker2;第十五页,共46页。2005年3月157.2.3直接定义结构类型(lèixíng)变量(续) 一个结构体变量占用内存的实际大小,也可以利用sizeof运算求出。它的运算表达式为: sizeof(运算量) //求出给定的运算量占用内存空间的字节数 其中(qízhōng)运算量可以是变量、数组或结构体变量,也可以是数据类型的名称。 例如: sizeof(structworker) sizeof(worker1)第十六页,共46页。2005年3月167.3结构体变量的使用(shǐyòng)形式和初始化7.3.1结构体变量的使用形式(xíngshì) 在定义了结构体变量以后,就可以使用这个变量。结构体变量是不同数据类型的若干数据的集合体。在程序中使用结构体变量时,一般情况下不能把它作为一个整体参加数据处理,而参加各种运算和操作的是结构体变量的各个成员项数据。 结构体变量的成员用以下一般形式(xíngshì)表示: 结构体变量名.成员名 例如,上节给出的结构体变量worker1具有下列七个成员: ;;; ;;;

第十七页,共46页。2005年3月177.3.1结构(jiégòu)体变量的使用形式(续) 在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员(chéngyuán)赋值。例如: strcpy(,”ZhangSan”); worker1.age=26; strcpy(worker1.phone,”1234567”); worker1.sex=’m’; : : 除此之外,还可以引用结构体变量成员(chéngyuán)的地址以及成员(chéngyuán)中的元素。例如:引用结构体变量成员(chéngyuán)的首地址;引用结构体变量成员(chéngyuán)的第二个字符[1];引用结构体变量的首地址&worker1。第十八页,共46页。2005年3月187.3.1结构体变量(biànliàng)的使用形式(续) 在使用结构体类型变量时有以下几点需要加以注意: (1)不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体类型变量中的各个成员分别引用。 例如,对上面定义的结构体类型变量wan,下列引用都是错误的: cout<<wan; cin>>wan; 但是(dànshì)可以如下引用: cout<<; cin>>;第十九页,共46页。2005年3月197.3.1结构体变量(biànliàng)的使用形式(续) (2)如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型变量worker1,可以(kěyǐ)这样访问各成员:

worker1.birthday.year worker1.birthday.month worker1.birthday.day 注意:不能用来访问worker1变量中的成员birthday,因为birthday本身是一个结构体变量。第二十页,共46页。2005年3月207.3.1结构(jiégòu)体变量的使用形式(续) (3)对成员变量可以像普通变量一样进行(jìnxíng)各种运算(根据其类型决定可以进行(jìnxíng)的运算)。例如: worker2.age=worker1.age; sum=worker1.age+worker2.age; worker1.age++; (4)在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。 在C++程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。第二十一页,共46页。2005年3月217.3.2结构(jiégòu)体变量的初始化与其他类型变量一样,也可以给结构(jiégòu)体的每个成员赋初值,这称为结构(jiégòu)体的初始化。有两种初始化形式,一种是在定义结构(jiégòu)体变量时进行初始化,一般语法格式如下: struct结构(jiégòu)体名变量名={初始数据表}; 另一种是在定义结构(jiégòu)体类型时进行结构(jiégòu)体变量的初始化。一般语法格式如下: struct结构(jiégòu)体名 { 成员表列; }变量名={初始数据表};第二十二页,共46页。2005年3月227.3.2结构(jiégòu)体变量的初始化(续) 例如,前述student结构体类型的结构体变量(biànliàng)wan在说明时可以初始化如下: structstudentwan={”WanJun”,’m’,20,”SuZhouRoadNo.100”}; 它所实现的功能,与下列分别对结构体变量(biànliàng)的每个成员赋值所实现的功能相同: strcpy(,”WanJun”); wan.sex=’m’; wan.age=20; wan.addr=”SuZhouRoadNo.100”;第二十三页,共46页。2005年3月237.3.2结构(jiégòu)体变量的初始化(续) 与数组的初始化特性相同,结构体的初始化仅限于外部(wàibù)的和static型结构体。也就是说,在函数内部对结构体进行初始化时,必须指定该结构体为static型。对缺省存储类型的auto型结构体不能在函数内部对它们进行初始化。第二十四页,共46页。2005年3月247.4结构(jiégòu)体数组 具有相同结构体类型的结构体变量也可以组成数组,称它们为结构体数组。结构体数组的每一个(yīɡè)数组元素都是结构体类型的数据,它们都分别包括各个成员(分量)项。7.4.1结构体数组的定义 定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。可以采用三种方法:第二十五页,共46页。2005年3月257.4.1结构(jiégòu)体数组的定义1.先定义结构(jiégòu)体类型,再用它定义结构(jiégòu)体数组。结构(jiégòu)体数组的定义形式如下:struct结构(jiégòu)体名 {成员表列;};struct结构(jiégòu)体名结构(jiégòu)体数组名[n];例如(lìrú):structstudent{charname[20];charsex;intage;charaddr[20];};structstudentstu[3];第二十六页,共46页。2005年3月267.4.1结构(jiégòu)体数组的定义(续)2.在定义结构体类型同时定义结构体数组。结构体数组的定义形式如下:struct结构体名 {成员(chéngyuán)表列;}数组名[元素个数];例如(lìrú):structstudent{charname[20];charsex;intage;charaddr[20];}stu[3];第二十七页,共46页。2005年3月277.4.1结构(jiégòu)体数组的定义(续)3.直接定义结构(jiégòu)体数组结构(jiégòu)体数组的定义形式如下:struct//没有结构(jiégòu)体名{成员表列; }数组名[元素个数];

例如(lìrú):struct{charname[20];charsex;intage;charaddr[20];}stu[3];第二十八页,共46页。2005年3月287.4.1结构(jiégòu)体数组的定义(续) 结构体数组名表示该结构体数组的存储(cúnchǔ)首地址。 结构体数组适合于处理由若干具有相同关系的数据组成的数据集合体。用结构体数组处理数据时可以使用循环,从而使程序十分简炼。第二十九页,共46页。2005年3月29共用体类型变量可以向另一个相同共用体类型的变量赋值。直接定义结构(jiégòu)体数组floatsalary;floatsalary;charaddress[80];第二十九页,共46页。(3)对成员变量可以像普通变量一样进行(jìnxíng)各种运算(根据其类型决定可以进行(jìnxíng)的运算)。1结构体变量(biànliàng)的使用形式(续)第二十七页,共46页。name或stu[2].在实际的处理对象中,有许多信息是由多个(duōɡè)不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。floatsalary;除此之外,还可以引用结构体变量成员(chéngyuán)的地址以及成员(chéngyuán)中的元素。结构体可以(kěyǐ)按值传递,这种情况下整个结构值都将被复制到形参中去。1共用(ɡònɡyònɡ)体的概念在实际的处理对象中,有许多信息是由多个(duōɡè)不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。7.4.2结构(jiégòu)体数组的初始化 结构体数组在定义的同时也可以进行(jìnxíng)初始化,并且与结构体变量的初始化规定相同,只能对全局的或静态存储类别的结构体数组初始化。 结构体数组初始化的一般形式是:struct结构体名{成员表列;};struct结构体名数组名[元素个数]={初始数据表};第三十页,共46页。2005年3月307.4.2结构(jiégòu)体数组的初始化(续)或者:struct结构体名{成员表列;}数组名[元素个数]={初始数据表}; 在对结构体数组进行初始化时,方括号[]中元素个数可以不指定。编译时,系统会根据给出初始的结构体常量的个数来确定数组元素的个数。 由于结构体变量(biànliàng)是由若干不同类型的数据组成,而结构体数组又是由若干结构体变量(biànliàng)组成。所以要特别注意包围在大括号中的初始数据的顺序,以及它们与各个成员项间的对应关系。第三十一页,共46页。2005年3月317.4.3结构(jiégòu)体数组的使用(续)一个结构体数组的元素相当于一个结构体变量,因此前面介绍的有关结构体变量的规则也适应(shìyìng)于结构体数组元素。以上面定义的结构体数组stu[3]为例说明对结构体数组的引用: (1)引用某一元素中的成员。 若要引用数组第二个元素的name成员,则可写为: stu[1].name 若数组已如前所示进行了初始化,则stu[1].name的值为“LiuYong”。第三十二页,共46页。2005年3月327.4.3结构(jiégòu)体数组的使用(续) (2)可以将一个结构体数组元素值赋给同一结构体类型的数组中的另一个元素,或赋给同一类型的变量。如: structstudentstu[3],student1; 现在定义(dìngyì)了一个结构体类型的数组,它有3个元素,又定义(dìngyì)了一个结构体类型变量student1,则下面的赋值是合法的。 student1=stu[0]; stu[0]=stu[1]; stu[1]=student1;第三十三页,共46页。2005年3月337.4.3结构(jiégòu)体数组的使用(续) (3)不能把结构体数组元素作为一个整体直接进行输入输出。如: cout<<stu[0];或 cin>>stu[0];都是错误的。 只能以单个成员(chéngyuán)为对象进行输入输出,如: cin>>stu[0].name; cin>>stu[1].num; cout<<stu[0].name; cout<<stu[1].num;第三十四页,共46页。2005年3月347.5结构(jiégòu)体与函数 在调用函数时,可以把结构体变量的值作为参数传递给函数。由于结构体是多个数据(shùjù)的集合体,当把它们传递给函数时,C++的编译系统不允许把结构体变量整体作为一个参数传递到函数中去。因此,只能把每个结构体变量的成员作为一个个的参数传递到函数中去。例如,用stu[1].name或stu[2].age作函数实参,将实参值传给形参。这种用法和用普通变量作实参是一样的,属“值传递”方式。这种方式一般不常用。

第三十五页,共46页。2005年3月357.5结构(jiégòu)体与函数(续)一种常用的方式是,与数组在函数间传递一样,结构体传递给函数时,一般采用地址传递方式,即把结构体变量(或数组)的存储地址作为参数向函数传递,函数中用指向相同(xiānɡtónɡ)结构体类型的指针接收该地址值。然后,在函数中通过这个结构体指针来处理结构体变量(或数组)中的各项数据。第三十六页,共46页。2005年3月367.5结构(jiégòu)体与函数(续)7.6.1传递结构值 结构体可以(kěyǐ)按值传递,这种情况下整个结构值都将被复制到形参中去。7.6.2传递结构体的引用 结构体也可以(kěyǐ)引用传递,这种情况下仅仅把结构体变量地址传递给形参。引用传递效率较高,因为它不用传递整个结构体变量的值,节省了传递的时间和空间。7.6.3传递结构体的指针 结构体变量(或数组)的值也可以(kěyǐ)通过结构体指针传递,但程序的可读性比引用传递要差一些。

第三十七页,共46页。2005年3月377.6共用(ɡònɡyònɡ)体7.6.1共用体的概念 在C++语言中,不同数据类型的数据可以使用共同的存储区域(qūyù),这种数据构造类型称为共用体,简称共用,又称联合体。共用体在定义、说明和使用形式上与结构体相似。两者本质上的不同仅在于使用内存的方式上。 定义一个共用体类型的一般形式为: union共用体名 { 成员表列; };第三十八页,共46页。2005年3月387.6.1共用(ɡònɡyònɡ)体的概念例如: uniongy { inti; charc; floatf; }; 就定义了一个(yīɡè)共用体类型uniongy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。如上述共用体类型uniongy的变量占用4个字节的内存。第三十九页,共46页。2005年3月397.6.1共用(ɡònɡyònɡ)体的概念(续) 在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。 例如,定义(dìngyì)了一个结构体类型: structgy { inti; charc; floatf; }; 则结构体类型structgy的变量占用的内存为2+1+4=7个字节。第四十页,共46页。2005年3月407.6.1共用(ɡònɡyònɡ)体的概念(续) 定义共用体类型变量的方法与定义结构体类型变量的方法相似,也有三种(sānzhǒnɡ)方法:1、union共用体名 { 成员表列; }变量表列; 例如: uniongy { inti; charc; floatf; }a,b,c;第四十一页,共46页。2005年3月417.6.1共用(ɡònɡyònɡ)体的概念(续)2、将共用(ɡònɡyònɡ)体类型定义与共用(ɡònɡyònɡ)体变量定义分开:uniongy{inti; charc; floatf;};uniongya,b,c;3、直接(zhíjiē)定义共用体

温馨提示

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

评论

0/150

提交评论