第十四章结构体与共用体.ppt

上传人:本田雅阁 文档编号:3129991 上传时间:2019-07-14 格式:PPT 页数:35 大小:167.52KB
返回 下载 相关 举报
第十四章结构体与共用体.ppt_第1页
第1页 / 共35页
第十四章结构体与共用体.ppt_第2页
第2页 / 共35页
第十四章结构体与共用体.ppt_第3页
第3页 / 共35页
第十四章结构体与共用体.ppt_第4页
第4页 / 共35页
第十四章结构体与共用体.ppt_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《第十四章结构体与共用体.ppt》由会员分享,可在线阅读,更多相关《第十四章结构体与共用体.ppt(35页珍藏版)》请在三一文库上搜索。

1、第十四章 结构体与共用体,14.1 结构体 我们可以通过前面学习过的数组,来构造若干个相同类型的数据的集合。当需要使用不同的数据类型进行构造数据集合时,我们可以使用结构体。一个结构体可以由若干个成员组成,不同的结构体可以根据需要,选择不同的成员组成。对于某一具体的结构体类型,成员的数量必须固定,结构体中各成员在内存中占据连续的存储单元,这两点均与数组相同。不过,在结构体中各成员可以具有不同的数据类型,而数组中每个元素都是相同数据类型,这是数组与结构体最重要的区别。,例如可以通过结构体来构造学员的档案信息,假如包括如下数据项: 姓名(name):字符串 性别(sex):字符型 年龄(age):整

2、型 总分(score):实数 我们可以将这4个成员组成一个名为student的整体,这就构成了结构体类型。,一. 结构体类型的说明,结构体类型说明的一般形式如下: struct 结构体名 类型名1 成员名1; 类型名2 成员名2; 类型名n 成员名n; ;,说明:,struct是结构体类型说明的关键字,结构体名以及成员名都是用户自定义的标识符。 结构体名用来唯一标识该结构体,可以省略不写。 结构体中所含的成员个数,根据需要可以是任意多个。结构体中的成员名可以和程序中的其他变量名同名,不同结构中的成员也可以同名。 结构体说明要以分号(;)结尾。,例14.1 构造一个结构体,用来说明上面的学员档案

3、信息。 struct student char name10; char sex; short int age; float score; ;,在本例中student是结构体,结构体包含了4个成员变量。 结构体类型所占的存储单元数是该结构体类型中所有成员占用的存储单元数的总和。例如上述student结构体占用了17个字节的内存空间(name占10个字节,sex占1个字节,age占2个字节,score占4个字节),在内存中各个成员的内存地址是连续的,内存单元分配如下图所示:,name,sex,age,sorce,结构体可以嵌套说明,即在结构体说明里再说明另外一个结构。 例14.2 struct

4、stu char name10; char sex; struct date int year; int mon; int day; birthday; int age; float score; ;,二. 定义结构体类型的变量、指针变 量和数组,定义结构体类型变量、指针变量和数组有以下多种方式。 (1)直接在结构体类型说明之后定义结构体变量。例如: 例14.3 struct student char name10; char sex; int age; float score; s1, *ps, stu3;,本例中在说明结构类型struct student的同时,定义了一个结构体变量s1,一

5、个基类型为结构体类型的指针变量ps和有三个元素的结构体数组stu3。 结构体变量中的各成员在内存中按说明中顺序依次排列。具有这一结构类型的变量只能存放一组数据(即一个学生信息)。如果要存放多个学生的数据,就要使用结构体数组。例14.3中,数组stu可以存放三个学生的信息,它的每个元素都是一个struct student类型的变量;ps为基类型struct student结构类型的指针变量,ps可以指向任意struct student类型的变量。如可以ps赋值:ps=&s1;以让ps指向s1结构体变量。,(2)在说明结构体类型时,不指定结构体名,而直接定义结构体变量、数组和指针。例如: 例14.

6、4 struct char name10; char sex; int age; float sorce; s1, *ps, stu3; 本例中,省去了结构体名称,而是直接在说明结构体时定义结构体变量、数组和指针,该例中除了没有结构体名外,其他均与(1)中相同。这种情况是,只能用该结构体类型定义一次变量、数组和指针。,(3)先说明结构体类型,再进行变量的定义。这种方法可以在以后的程序中多处定义变量。例如: 例14.5 struct student char name10; char sex; int age; float score; ; struct student s1, *ps, stu

7、3;,本例中先说明了struct student结构体类型,然后再通过struct student这个结构体类型来定义、指针和数组。可以把struct student当作普通的数据类型来理解。在该结构体类型说明后,其他地方都可以用struct student来定义变量。作为结构体类型,struct必须与结构体标识名共同来说明不同的结构类型。不能只写结构体标识名student而省略struct,因为student不是类型标识符。由关键字struct和student一起才能唯一地确定所说明的结构体类型。,(4)使用typedef说明一个结构体类型名,再用新类型名来定义变量。例如: 例14.6 ty

8、pedef struct char name10; char sex; int age; float score; STU; STU s1, *ps, stu3; 本例中用了typedef来对结构体进行说明,这样STU是一个具体的结构体类型名,它代表上面所指定的一个结构体类型,能够唯一的标识这种结构体类型。因此,可以用它来直接定义变量,而不用再写struct。,三. 给结构体变量赋初值,(1)结构体变量赋初值。和其他基本数据类型的变量一样,结构体变量在定义的时候可同时赋初值。所赋值以成员定义出现的顺序依次放在一对花括号内,例如: 例14.7 struct student char name10

9、; char sex; int age; float score; s1=“Jim”, M, 20, 89; 对结构体变量进行赋初值时,C编译系统按照每个成员在结构体中定义的顺序一一对应赋初值,不允许跳过前边的成员给后面的成员赋初值。但可以只给前面的若干个成员赋初值,对于后面未赋初值的成员,如果是数值型和字符型数据,系统会自动赋初值零。,(2)给结构体数组赋初值。 例14.8 struct student char name10; char sex; int age; float score; stu3=“Jim”, M, 20, 89, “Sam”, W, 21, 78, “Bill”, M

10、, 22, 85; 结构体数组中各元素之间的地址空间是连续的,且每个元素中的各成员,根据其定义的顺序,其各成员的地址空间也是连续的。,四. 引用结构体变量中的成员,1. 对结构体成员引用 引用结构体成员有三种形式:结构体变量名.成员名;结构体指针变量-成员名;(*结构体指针变量).成员名。 上述3种形式中,点(.)是成员运算符,箭头(-)称为结构指向运算符,由减号(-)和大于号()两部分构成,之间不得有空格。第三种形式中,先用指针的间接访问运算符,再用成员运算符来访问成员,其中一对圆括号不可少。,例如有以下定义和语句: struct stu char name10; char sex; str

11、uct date int year; int mon; int day; birthday; int age; float grade3; float score; s1, *ps, s3; ps=,同种类型的结构体变量地址才能赋给同种类型的结构体指针变量。可以进行如下的操作: (1)若引用结构体变量s1中的age成员,可写作: s1.age ps-age (*ps).age (2)引用结构体数组元素的成员,如:s0.age。 (3)如要访问结构体中的数组成员,如: s1.grade0,这就访问了s1结构体变量的grade数组成员第一个元素。C语言不允许对数组整体访问(字符串除外),只能逐个引

12、用其元素。如可以这样引用s0.grade1, 即引用了s0元素的grade1数组元素。,(4)若结构体中的字符数组存放的是字符串,则可以对其数组名直接引用,如s1.name、ps-name或(*ps).name。 (5)嵌套定义的结构体变量成员的引用:在结构体说明中,某成员变量又是一个结构体变量,若要引用其成员,可以一级一级地找到最低一级的成员,例如要引用s1结构体变量的birthday的year成员,则可以写作:s1.birthday.year,或ps-birthday.year和(*ps).birthday.year。对于多层嵌套的结构体,引用方式与此类似,即按照从最外层到最内层的顺序逐层

13、引用,每层用成员运算符(.)隔开。,2. 对结构体变量中的成员进行操作,(1)对结构体变量中的整型age成员进行输入输出。 输入: scanf(“%d”, ,(2)对结构体变量中的字符串name成员进行输入或输出。 输入: scanf(“%s”, s1.name);或gets(s1.name); scanf(“%s”,s0.name);或gets(s0.name); scanf(“%s”, ps-name);或gets(ps-name); 输出: printf(“%s”, s1.name); 或puts(s1.name);,(3)对结构成员变量birthday的成员year进行操作。 输入:

14、scanf(“%d”, ,3. 通过指针变量来引用结构体成员,当通过指针变量来引用结构体成员,并且与+、 -等运算符组成表达式时,应当根据运算符的优先级来确定表达式的含义。例如: struct int a; char *s; x, *p= 假设变量x的成员a、指针变量s已经正确赋值,则表达式+p-a是使a增加1,而不是p增加1,因为运算符-优先级高于+,该表达式等价于+(p-a)。如果要在访问a之前使p增加1,应当写成(+p)-a。 同理,表达式*p-s,引用的是变量x中s所指存储单元。表达式*p-s+是在引用了s所指存储单元之后,使指针s增1。表达式(*p-s)+,使s所指向的存储单元的值增

15、1,而*p+-s在访问了s所指存储单元之后,使p增1。,五. 函数之间结构体变量的数据传递,(1)向函数传递结构体变量的成员。 (2)向函数传递结构体变量。结构体变量作参数时,C语言是把结构体变量作为普通变量来进行处理的,即在被调用函数中会为形参开辟一个新的存储单元来存放实参传递过来的值。 (3)传递结构体变量的地址。,例14.10 结构体变量地址作参数 #include “string.h” typedef struct char name10; char sex; int age; float score; STU; void fun(STU *ps) strcpy(ps-name,“Jo

16、hn”); ps-sex=W; ps-age=21; ps-score=78.5; main() STU s=“Jim”, M, 20, 89; printf(“(1)s: %s %c %d %fn”, s.name, s.sex, s.age, s.score); fun( 答案:(1)s: Jim M 20 89 (2)s: John W 21 78.9,六. 用结构体构成链表,像这样A指向B,B指向C,A、B、C通过指针连接在一起的结构称为链表。在链表中的每个结构体变量,称为链表的结点,即指向了链表的头,我们称p为链表的头指针。 注意:链表中的每个结点,在内存中不一定是连续 分配的。,p

17、,A,B,C,a.data,a.next,结点a的存储形式,结构体链表,例14.11 一个简单的链表程序 #include “stdio.h” struct link char data; struct link *next; ; typedef struct link LINK; main() LINK a, b, c, *p, *s; a.data=A; b.data=B; c.data=C; p= 程序运行后的结构为_。 答案:A B C,14.2 共用体,共用体与结构体的唯一区别:结构体的各成员都有各自的内存存储单元,结构体类型占用存储空间的总字节数,即为各成员所占字节数的总和;而共用

18、体则不一样,在共用体中,各成员使用共同的存储单元,共用体占用存储空间的总字节为共用体中占字节数最大的那个成员的存储字节数。,一. 共用体类型的说明和变量的定义,1. 共用体类型的说明 C语言提供了关键字union来说明共用体类型。共用体类型说明的一般形式: union 共用体标识名 类型名1 共用体成员名1; 类型名2 共用体成员名2; . 类型名n 共用体成员名n; ;,例如: union un int i; char c; float f; u1; 上例中说明了共用体union un,un为共用体的标识名。在说明共用体类型的同时定义了共用体变量u1。,2. 共用体变量的定义,例如: uni

19、on un_1 int a; char c; float fd; un=66; 说明: (1)共用体变量在定义的同时只能用第一个成员的类型值进行初始化,因此,以上定义的变量un,在定义的同时赋予整型值。 (2)由于共用体变量中的所有成员存储单元,因此所有成员的首地址相同,变量的地址就是该变量的所有成员的地址。,二. 共用体变量的引用,1. 共用体变量中成员的引用 与结构体成员访问方式相同,共用体也可以通过以下方式引用共用体的成员。 (1)共用体变量名.成员名 (2)共用体指针变量名-成员名。 (3)(*共用体指针变量名).成员名,例如: union un int i; char c; floa

20、t f; u1; 有以上定义后,可以按如下方式来引用u1的各成员: u1.i=20; u1.c=getchar(); scanf(“%f”, 注意:共用体在某一时间内,只有一个成员的值有效,即最近存入的成员变量的值,而原来的成员变量的值被覆盖。,2. 共用体变量的整体赋值,例如: union un int i; char c; float f; u1, u2; u1.i=20; u2=u1; 由此例可以看出,u1赋给u2,即把一个共用体变量直接赋给另外一个共用体变量,这样是可行的,且对于u2,此时有效的成员是u1赋值时有效的成员,即i成员。,3. 向函数传递共用体变量的值,与结构体变量一样,共用体类型的变量可以作为实参进行函数传递,也可以传递共用体变量地址。 例14.12 利用共用体类型的特点分别取出int变量中高字节和低字节的两个数。 union change char c2; int a; un; main() un.a=16961; printf(“%d,%cn”, un.c0, un.c0); printf(“%d,%cn”, un.c1, un.c1); 输出结果为_。 答案:65,A 66,B,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1