C程序设计教程第7章结构体与共用体

上传人:工**** 文档编号:591528823 上传时间:2024-09-18 格式:PPT 页数:53 大小:153.50KB
返回 下载 相关 举报
C程序设计教程第7章结构体与共用体_第1页
第1页 / 共53页
C程序设计教程第7章结构体与共用体_第2页
第2页 / 共53页
C程序设计教程第7章结构体与共用体_第3页
第3页 / 共53页
C程序设计教程第7章结构体与共用体_第4页
第4页 / 共53页
C程序设计教程第7章结构体与共用体_第5页
第5页 / 共53页
点击查看更多>>
资源描述

《C程序设计教程第7章结构体与共用体》由会员分享,可在线阅读,更多相关《C程序设计教程第7章结构体与共用体(53页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计湖南大学 杜四春、银红霞 第7章 结构体与共用体 7.1 结构体的概念 7.2 结构体类型变量的定义方法 7.3 结构体变量的使用形式和初始化 7.4 结构体数组 7.5 结构体与指针 7.6 结构体与函数 7.7 共用体 .C+程序设计湖南大学 杜四春、银红霞在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。此时,就要用到一种新的构造类型数据结构体structure),简称结构。结构体的使用为处理复杂的数据结构如动态数据结构等提供了有效的手段,而且,它们为函数间传递不同类型的数据提供了方便。同时也介绍在相

2、同存储区域内存储不同数据类型的构造类型共用体也称联合体的相关概念。 .C+程序设计湖南大学 杜四春、银红霞7.1 结构体的概念结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项当然也可以相同),从而使这些数据项组合起来反映某一个信息。结构体相当于COBOL 和PASCAL等高级语言中的“记录” 。例如,可以定义一个职工worker结构体,在这个结构体中包括职工编号、姓名、性别、年龄、工资、家庭住址、联系电话。这样就可以用一个结构体数据类型的变量来存放某个职工的所有相关信息。并且,用户自定义的数据类型worker也可以与int、double等基本数据类型一样,

3、用来作为定义其他变量的数据类型。 .C+程序设计湖南大学 杜四春、银红霞定义一个结构体类型的一般形式为:struct 结构体名数据类型成员名1;数据类型成员名2;:数据类型成员名n;在大括号中的内容也称为“成员表列或“域表”。其中,每个成员名的命名规则与变量名相同;数据类型可以是基本变量类型和数组类型,也可以是指针变量类型,或者是一个结构体类型;用分号“;”作为结束符。整个结构的定义也用分号作为结束符, .C+程序设计湖南大学 杜四春、银红霞例如:定义一个职工worker结构体如下:struct worker long number; char name20; char sex; /sex是成

4、员名 int age; float salary; char address80; char phone20; ; /注意分号不要省略int sex=10; /sex是变量名 .C+程序设计湖南大学 杜四春、银红霞结构体类型中的成员名可以与程序中的变量名相同,二者并不代表同一对象,编译程序可以自动对它们进行区分。 最后,总结一下结构体类型的特点:(1结构体类型是用户自行构造的。(2它由若干不同的基本数据类型的数据构成。(3它属于C+语言的一种数据类型,与整型、实型相当。因而,定义它时不分配空间,只有用它定义变量时才分配空间。 .C+程序设计湖南大学 杜四春、银红霞7.2 结构体类型变量的定义方

5、法结构体只是用户自定义的一种数据类型,因此要通过定义结构体类型的变量来使用这种类型。通常有三种形式来定义一个结构体类型变量,分别说明如下:7.2.1 先定义结构体类型再定义变量名这是C+语言中定义结构体类型变量最常见的方式,一般语法格式如下:struct 结构体名 成员表列;struct 结构体名 变量名;.C+程序设计湖南大学 杜四春、银红霞例如,定义几个职工变量:struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; struct worke

6、r worker1,worker2; .C+程序设计湖南大学 杜四春、银红霞注意:“struct worker代表类型名,不能分开写为:struct worker1,worker2; /错误,没有指明是哪种结构体类型或worker worker1,worker2; /错误,没有struct关键字/系统不认为worker是结构体类型 为了使用上的方便,程序员通常用一个符号常量代表一个结构体类型。即在程序开头加上下列语句:#define WORKER struct worker;这样在程序中,WORKER与struct worker完全等效。 .C+程序设计湖南大学 杜四春、银红霞例如:WORKE

7、R long number; char name20; char sex; int age; float salary; char address80; char phone20; ;WORKER worker1,worker2;此 时 , 可 以 直 接 用 WORKER定 义 worker1、worker2两个变量,而不必再写关键字struct。.C+程序设计湖南大学 杜四春、银红霞如果程序规模比较大,往往将对结构体类型的定义集中写入到一个头文件以.h为后缀中。哪个源文件需用到此结构体类型则可用#include命令将该文件包含到本文件中。这样做便于程序的修改和使用。 7.2.2 在定义类型

8、的同时定义变量这种形式的定义的一般形式为:struct 结构体名 成员表列;变量名; .C+程序设计湖南大学 杜四春、银红霞例如:struct worker long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2; 此例与前例作用相同,都定义了两个变量worker1、worker2,它们是结构体类型struct worker。 .C+程序设计湖南大学 杜四春、银红霞7.2.3 直接定直接定义结构构类型型变量量其一般形式其一般形式为:struc

9、t /没有没有结构体名构体名 成成员表列表列 变量名;量名; .C+程序设计湖南大学 杜四春、银红霞例如:struct long number; char name20; char sex; int age; float salary; char address80; char phone20; worker1,worker2; .C+程序设计湖南大学 杜四春、银红霞一个结构体变量占用内存的实际大小,也可以利用sizeof运算求出。它的运算表达式为:sizeof运算量) /求出给定的运算量占用内存空间的字节数其中运算量可以是变量、数组或结构体变量,也可以是数据类型的名称。 例如:sizeof(

10、struct worker)sizeof(worker1) .C+程序设计湖南大学 杜四春、银红霞7.3 结构体变量的使用形式和初始化7.3.1 结构体构体变量的使用形式量的使用形式在在定定义了了结构构体体变量量以以后后,就就可可以以使使用用这个个变量量。结构构体体变量量是是不不同同数数据据类型型的的若若干干数数据据的的集集合合体体。在在程程序序中中使使用用结构构体体变量量时,一一般般情情况况下下不不能能把把它它作作为一一个个整整体体参参加加数数据据处理理,而而参参加加各各种种运运算算和和操操作作的的是是结构构体体变量量的的各各个个成成员项数据。数据。结构体构体变量的成量的成员用以下一般形式表

11、示:用以下一般形式表示:结构体构体变量名量名.成成员名名例例如如,上上节给出出的的结构构体体变量量worker1具具有下列七个成有下列七个成员:worker1.number;worker1.name;worker1.sex;worker1.age;worker1.salary;worker1.address;worker1.phone .C+程序设计湖南大学 杜四春、银红霞在定义了结构体变量后,就可以用不同的赋值方法对结构体变量的每个成员赋值。例如:strcpy(worker1.name,”Zhang San”);worker1.age=26;strcpy(worker1.phone,”123

12、4567”);worker1.sex=m; : :除此之外,还可以引用结构体变量成员的地址以及成员中的元素。例如:引用结构体变量成员的首地址&worker1.name;引用结构体变量成员的第二个字符worker1.name1;引用结构体变量的首地址&worker1。 .C+程序设计湖南大学 杜四春、银红霞在使用结构体类型变量时有以下几点需要加以注意:(1不能将一个结构体类型变量作为一个整体加以引用,而只能对结构体类型变量中的各个成员分别引用。例如,对上面定义的结构体类型变量wan,下列引用都是错误的:coutwan;但是可以如下引用:coutwan.name; .C+程序设计湖南大学 杜四春、

13、银红霞(2如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级成员。只能对最低级的成员进行赋值或存取以及运算。例如,对上面定义的结构体类型变量worker1,可以这样访问各成员:worker1.ageworker1.nameworker1.birthday. yearworker1.birthday. monthworker1.birthday. day注意:不能用worker1.birthday来访问worker1变量中的成员birthday,因为birthday本身是一个结构体变量。 .C+程序设计湖南大学 杜四春、银红霞(3对成员变量可以像普通变量一样进行各种

14、运算根据其类型决定可以进行的运算)。例如:worker2.age=worker1.age;sum=worker1.age+worker2.age;worker1.age+;(4在数组中,数组是不能彼此赋值的,而结构体类型变量可以相互赋值。 在C+程序中,同一结构体类型的结构体变量之间允许相互赋值,而不同结构体类型的结构体变量之间不允许相互赋值,即使两者包含有同样的成员。 .C+程序设计湖南大学 杜四春、银红霞7.3.2 结构体构体变量的初始化量的初始化与与其其他他类型型变量量一一样,也也可可以以给结构构体体的的每每个个成成员赋初初值,这称称为结构构体体的的初初始始化化。有有两两种种初初始始化化

15、形形式式,一一种种是是在在定定义结构构体体变量量时进行初始化,一般行初始化,一般语法格式如下:法格式如下:struct 结构体名构体名 变量名量名=初始数据表初始数据表;另另一一种种是是在在定定义结构构体体类型型时进行行结构构体体变量的初始化。一般量的初始化。一般语法格式如下:法格式如下:struct 结构体名构体名 成成员表列;表列;变量名量名=初始数据表初始数据表; .C+程序设计湖南大学 杜四春、银红霞例如,前述student结构体类型的结构体变量wan在说明时可以初始化如下:struct student wan=”Wan Jun”,m,20,” SuZhou Road No.100”;

16、它所实现的功能,与下列分别对结构体变量的每个成员赋值所实现的功能相同:strcpy(wan.name,” Wan Jun”);wan.sex=m;wan.age=20;wan.addr=” SuZhou Road No.100”; .C+程序设计湖南大学 杜四春、银红霞与数组的初始化特性相同,结构体的初始化仅限于外部的和static型结构体。也就是说,在函数内部对结构体进行初始化时,必须指定该结构体为static型。对缺省存储类型的auto型结构体不能在函数内部对它们进行初始化。 .C+程序设计湖南大学 杜四春、银红霞7.4 结构体数组具有相同结构体类型的结构体变量也可以组成数组,称它们为结构

17、体数组。结构体数组的每一个数组元素都是结构体类型的数据,它们都分别包括各个成员分量项。7.4.1 结构体数组的定义定义结构体数组的方法和定义结构体变量的方法相仿,只需说明其为数组即可。可以采用三种方法: .C+程序设计湖南大学 杜四春、银红霞1. 先定义结构体类型,再用它定义结构体数组。先定义结构体类型,再用它定义结构体数组。结构体数组的定义形式如下:结构体数组的定义形式如下:struct 结构体名结构体名 成员表列;成员表列;struct 结构体名结构体名 例如:struct student char name20; char sex; int age; char addr20;struct

18、 student stu3; .C+程序设计湖南大学 杜四春、银红霞2. 在定义结构体类型同时定义结构体数组。在定义结构体类型同时定义结构体数组。结构体数组的定义形式如下:结构体数组的定义形式如下:struct 结构体名结构体名 成员表列;成员表列;数组名数组名元素个数元素个数;例如:struct student char name20; char sex; int age; char addr20;stu3; .C+程序设计湖南大学 杜四春、银红霞3. 直接定义结构体数组直接定义结构体数组结构体数组的定义形式如下:结构体数组的定义形式如下:struct /没有结构体名没有结构体名 成员表列;

19、成员表列;数组名数组名元素个数元素个数; 例如:struct char name20; char sex; int age; char addr20;stu3; .C+程序设计湖南大学 杜四春、银红霞结构体数组名表示该结构体数组的存储首地址。结构体数组适合于处理由若干具有相同关系的数据组成的数据集合体。用结构体数组处理数据时可以使用循环,从而使程序十分简炼。.C+程序设计湖南大学 杜四春、银红霞7.4.2 结构体数构体数组的初始化的初始化结构构体体数数组在在定定义的的同同时也也可可以以进行行初初始始化化,并并且且与与结构构体体变量量的的初初始始化化规定定相相同同,只只能能对全全局局的的或或静静

20、态存存储类别的的结构构体体数数组初初始始化。化。结构体数构体数组初始化的一般形式是:初始化的一般形式是:struct 结构体名构体名 成成员表列;表列;struct 结构构体体名名 数数组名名元元素素个个数数=初初始始数数据据表表;.C+程序设计湖南大学 杜四春、银红霞或者:struct 结构体名 成员表列;数组名元素个数=初始数据表; 在对结构体数组进行初始化时,方括号 中元素个数可以不指定。编译时,系统会根据给出初始的结构体常量的个数来确定数组元素的个数。由于结构体变量是由若干不同类型的数据组成,而结构体数组又是由若干结构体变量组成。所以要特别注意包围在大括号中的初始数据的顺序,以及它们与

21、各个成员项间的对应关系。.C+程序设计湖南大学 杜四春、银红霞7.4.3 结构体数构体数组的使用的使用一一个个结构构体体数数组的的元元素素相相当当于于一一个个结构构体体变量量,因因此此前前面面介介绍的的有有关关结构构体体变量量的的规则也也适适应于于结构构体体数数组元元素素。以以上上面面定定义的的结构构体数体数组stu3为例例说明明对结构体数构体数组的引用:的引用:(1引用某一元素中的成引用某一元素中的成员。若若要要引引用用数数组第第二二个个元元素素的的name成成员,则可写可写为:stu1.name若若数数组已已如如前前所所示示进行行了了初初始始化化,则stu1.name的的值为“Liu Yo

22、ng”。.C+程序设计湖南大学 杜四春、银红霞(2可以将一个结构体数组元素值赋给同一结构体类型的数组中的另一个元素,或赋给同一类型的变量。如:struct student stu3,student1;现在定义了一个结构体类型的数组,它有3个元素,又定义了一个结构体类型变量student1,则下面的赋值是合法的。student1=stu0;stu0=stu1;stu1=student1; .C+程序设计湖南大学 杜四春、银红霞(3不能把结构体数组元素作为一个整体直接进行输入输出。如:coutstu0;都是错误的。只能以单个成员为对象进行输入输出,如:cinstu0.name;cinstu1.nu

23、m;coutstu0.name;cout成员名它与前一种表示方法在意义上是完全等价的。例如,结构体指针p指向的结构体变量中的成员name可以表示如下:(*p).name 或 p-name 在后种表示方法中,“-”(减号和大于号也是一种运算符。从表2-4中看出,它在第一运算优先级中。它表示的运算意义是,访问指针指向的结构体变量中的成员。 .C+程序设计湖南大学 杜四春、银红霞7.5.2 结构体数构体数组指指针在在C+语言言中中,把把指指向向结构构体体数数组或或数数组元素的指元素的指针称称为结构体数构体数组指指针。 例例7-7 .C+程序设计湖南大学 杜四春、银红霞7.5.3 结构体指针数组结构体

24、指针数组在在一一个个数数组组中中,若若每每个个元元素素都都是是一一个个结结构构体指针,则称为结构体指针数组。体指针,则称为结构体指针数组。 例例7-8 .C+程序设计湖南大学 杜四春、银红霞7.6 结构体与函数在调用函数时,可以把结构体变量的值作为参数传递给函数。由于结构体是多个数据的集合体,当把它们传递给函数时,C+的编译系统不允许把结构体变量整体作为一个参数传递到函数中去。因而,只能把每个结构体变量的成员作为一个个的参数传递到函数中去。例如,用stu1.name或stu2.age作函数实参,将实参值传给形参。这种用法和用普通变量作实参是一样的,属“值传递方式。这种方式一般不常用。一种常用的

25、方式是,与数组在函数间传递一样,结构体传递给函数时,一般采用地址传递方式,即把结构体变量或数组的存储地址作为参数向函数传递,函数中用指向相同结构体类型的指针接收该地址值。然后,在函数中通过这个结构体指针来处理结构体变量或数组中的各项数据。 .C+程序设计湖南大学 杜四春、银红霞7.6.1 传递结构构值结构构体体可可以以按按值传递,这种种情情况况下下整整个个结构构值都将被复制到形参中去。都将被复制到形参中去。 例例7-9 .C+程序设计湖南大学 杜四春、银红霞7.6.2 传递结构体的引用构体的引用结构构体体也也可可以以引引用用传递,这种种情情况况下下仅仅把把结构构体体变量量地地址址传递给形形参参

26、。引引用用传递效效率率较高高,因因为它它不不用用传递整整个个结构构体体变量量的的值,节省了省了传递的的时间和空和空间。例例7-10 .C+程序设计湖南大学 杜四春、银红霞7.6.3 传递结构体的指构体的指针结构构体体变量量或或数数组的的值也也可可以以通通过结构构体体指指针传递,但但程程序序的的可可读性性比比引引用用传递要要差一些。差一些。例例7-11 .C+程序设计湖南大学 杜四春、银红霞7.7 共用体7.7.1 共用体的概念共用体的概念在在C+语言言中中,不不同同数数据据类型型的的数数据据可可以以使使用用共共同同的的存存储区区域域,这种种数数据据构构造造类型型称称为共共用用体体,简称称共共用

27、用,又又称称联合合体体。共共用用体体在在定定义、说明明和和使使用用形形式式上上与与结构构体体相相似似。两两者者本本质上的不同上的不同仅在于使用内存的方式上。在于使用内存的方式上。 定定义一个共用体一个共用体类型的一般形式型的一般形式为:union 共用体名共用体名成成员表列;表列; .C+程序设计湖南大学 杜四春、银红霞例如:union gyint i;char c;float f;就定义了一个共用体类型union gy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。由于共用体中各成员的数据长度往往不同,所以共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。如上述共用体

28、类型union gy的变量占用4个字节的内存。.C+程序设计湖南大学 杜四春、银红霞在这一点上共用体与结构体不同,结构体类型变量在存储时总是按各成员的数据长度之和占用内存空间。例如,定义了一个结构体类型:struct gyint i;char c;float f;则结构体类型struct gy的变量占用的内存为2+1+4=7个字节 。.C+程序设计湖南大学 杜四春、银红霞定义共用体类型变量的方法与定义结构体类型变量的方法相似,也有三种方法 :1、union 共用体名成员表列;变量表列;例如:union gyint i;char c;float f;a,b,c; .C+程序设计湖南大学 杜四春、

29、银红霞2、将共用体类型定义与共用体变量定义分开:union gyint i; char c; float f;union gy a,b,c;3、直接定义共用体变量:union int i; char c; float f;a,b,c;上面几种方法都是定义了一个共用体类型union data,又定义了几个共用体类型变量a,b,c。.C+程序设计湖南大学 杜四春、银红霞与结构体类型,也可以定义共用体指针和共用体数组。union 共用体名 *共用指针名;union 共用体名 数组名元素个数;例如:union gy *pu;union gy u13;分别定义了共用体指针pu和共用体数组u13。 .C+

30、程序设计湖南大学 杜四春、银红霞7.7.2 共用体共用体变量的使用形式量的使用形式由由于于共共用用体体变量量的的各各个个成成员使使用用共共同同的的内内存存区区域域,所所以以共共用用体体变量量的的内内存存空空间在在某某个个时刻刻只只能能保保持持某某个个成成员的的数数据据。由由此此可可知知,在在程程序序中中参参加加运运算算的的必必然然是是共共用用体体变量量的的某某个个成成员,而而不不能能直直接接使使用用共共用用体体变量量。共共用用体体变量量成成员的的表表现形形式式与与结构构体体相相同同,它它们也也使使用用访问成成员运算符运算符“.”和和“-”表示。表示。例例如如,前前面面定定义了了a,b,c为共共

31、用用体体类型型变量,下面的使用形式是正确的:量,下面的使用形式是正确的:a.i 引用共用体引用共用体变量中的整型量中的整型变量量ia.c 引用共用体引用共用体变量中的字符量中的字符变量量ca.f 引用共用体引用共用体变量中的量中的实型型变量量f.C+程序设计湖南大学 杜四春、银红霞不能只引用共用体类型变量,例如:couta是错误的,a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体类型变量名a难以使系统确定究竟输出的是那一个成员的值。应该写成couta.i或者couta.c等。 在使用共用体类型变量的数据时要注意:在共用体类型变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后

32、原有的成员就失去作用。如有以下赋值语句:a.i=1;a.c=a;a.f=1.5;在完成以上三个赋值运算以后,a.f是有效的,a.i和a.c已经无意义了。 .C+程序设计湖南大学 杜四春、银红霞共用体类型变量可以向另一个相同共用体类型的变量赋值。此外,共用体类型变量可以作为参数传递给函数,也可以使用地址传送方式把共用体类型变量的地址作为参数在函数间传递。在程序中经常使用结构体与共用体相互嵌套的形式。即共用体类型的成员可以是结构体类型,或者结构体类型的成员是共用体类型。.C+程序设计湖南大学 杜四春、银红霞例如,下列结构体类型datas的第三个成员是共用体类型: struct dataschar *ps;int type;unionfloat fdata;int idata;char cdata;udata;.C+程序设计湖南大学 杜四春、银红霞.

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号