《结构和联合》PPT课件.ppt
《《结构和联合》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《结构和联合》PPT课件.ppt(47页珍藏版)》请在三一办公上搜索。
1、第8章 结构和联合,8.1 结构的定义以及结构变量的定义和使用8.2 结构数组与结构指针8.3 结构在函数间的传递8.8 综合举例,8.1 结构的定义以及结构变量的定义和使用,8.1.1 结构的定义 结构是由不同数据类型的数据组成的。组成结构的每个数据称为该结构的成员项,简称成员。在程序中使用结构时,首先要对结构的组成进行描述,这称为结构的定义。结构定义的一般形式如下:struct 结构名 数据类型 成员名1;数据类型 成员名2;.数据类型 成员名n;,例如,为了处理雇员的数据,在程序中可以定义如下的结构:struct Employee char name20;char sex;int old
2、;int wage;该结构名字是Employee,它由四个成员项组成。第一个成员项是字符型数据name,它用于保存姓名字符串;第二个成员项是字符型数据sex,它用于保存性别字符;第三个成员项是int型整数old,它用于保存年龄数据;最后一个成员项是int型整数wage,它用于工资数据。,(1)结构的定义以关键字struct作为标识符,其后是定义的结构名,它们两者形成了特定结构的类型标识符。结构名由用户命名,命名原则与变量名等相同。结构名是这一组数据集合体的名字,可以像基本数据类型名一样,用来说明具体的结构变量。(2)在结构名下面的一对大括号中包围的是组成该结构的各个成员项。每个成员项由其数据类
3、型和成员名组成。每个成员项后用分号“;”作为结束符。整个结构的定义也用分号作为结束符,注意不要忘记这个分号。,(3)结构的定义明确地描述了该结构的组织形式。在程序执行时,结构的定义并不引起系统为该结构分配内存空间。结构的定义仅仅是定义了一种特定的数据构造类型,它指定了这种构造使用内存的模式。在定义时没有指明使用这种构造具体对象(在结构的说明时将指明这点)。如上述结构Employee的定义,仅仅指定了在使用这种结构时应该按下图所示的配置情况占用内存,但这时并没有实际占用内存空间。,图 8.1,8.1.2 结构变量的定义 程序一旦定义了一个结构体,就相当于定义了一个新的结构类型,那么就可以把结构名
4、当作像int、double等关键字一样使用,用说明语句定义该形式结构体的具体结构变量,其格式为:struct 结构名 结构变量名;结构变量的定义在程序的数据说明部分给出。例如,下列说明:struct Employee wang;这个说明指出了结构变量wang使用Employee结构,也就是说,结构变量wang是由前述的Employee的四个成员项组成,每个成员项的类型和名字都与Employee结构定义中给出的相同。,(1)结构变量的定义将引起系统按照结构定义时制定的内存模式,为被定义的结构变量分配一定的内存空间。例如,上述结构变量wang在内存中将占据与图8.1所示配置相同的内存空间。当多个结
5、构变量使用结构时,它们可以在一起定义。例如:struct Employee wang,li,zhang;被定义的三个结构变量wang、li和zhang都具有Employee定义的结构。,(2)结构变量使用内存空间,所以它们也具有一定的存储类型。结构变量的存储类型概念、它的寿命、可见性及使用范围与普通变量、数组完全一致。(3)在程序中,结构变量的定义在该结构的定义之后,对于尚未定义的结构,不能用它对任何结构进行说明。,(4)在一些简单的程序设计中,结构的定义和结构变量的定义也可以同时进行,在这种情况下,有时省略结构名。这时,被定义的结构变量直接在结构定义的大括号后给出,例如:struct Emp
6、loyee char name20;char sex;int old;int wage;wang,song,zhou;这种形式与前面给出的结构定义和结构说明分开进行时功能相同。,(5)一个结构变量占用内存的实际大小,可以利用sizeof运算求出。sizeof运算的功能是计算出给定的运算量占用内存空间的字节数,它的运算表达式一般形式如下:sizeof(运算量)其中运算量可以是变量、数组或结构变量,也可以是数据类型的名称,如int、double、struct Employee 等。,8.1.3 结构变量的使用形式和初始化 C提供了两种类型的聚合数据类型:数组和结构。数组是相同类型的元素的集合,它的
7、每个元素是通过下标引用或指针间接访问选择的。但在结构中情况并非如此,由于结构的成员可能长度不同,所以不能使用下标来访问它们。相反,每个结构成员都有自己的名字,它们是通过名字来访问的。此外,在结构说明的同时可以给各个成员项赋初值,即结构的初始化。,1、结构的使用形式 结构是不同数据类型的若干数据的集合体。在程序中使用结构时,一般情况下不能把结构作为一整体参加数据处理,而参加各种运算和操作的是结构的各个成员项数据。结构的成员项用以下一般形式表示:结构变量名.成员名 例如,上节给出的结构变量wang具有下列四个成员项:wang.name,wang.sex,wang.old,wang.wage 它们分
8、别表示结构变量wang的四个组成数据。,在指明结构成员项时使用的“.”符号是C语言的一个运算符,它规定的运算是访问结构的成员。例如,wang.old实质上是一个运算表达式,它的运算是访问结构wang的成员old。因此,它代表了结构变量wang中名字为old的成员项。访问成员运算“.”是第一运算优先级中的一种运算,它的结合规律是从左向右。明确这一点,对于分析包括有访问成员运算的复杂运算表达式中各种运算的先后顺序有很大帮助。,当结构的成员项是指针变量时,要注意它的使用形式上的特点。例如:struct Employee1 char*name;char sex;int old;int wage;zho
9、u;定义的Employee1结构中的成员项name是一个char型指针。如果结构变量zhou被说明为Employee1结构,则zhou的成员项 zhou.name是一个char型指针。那么下面的使用形式*zhou.name 表示是该指针指向的目标变量,它的意义可以从运算表达式的角度进分析。上述表达式中有两种运算:*(访问目标)和(访问成员)。运算优先于*运算。所以,访问成员运算在先,而访问目标运算在后。上面的表达式等价于:*(zhou.name),例8.1 结构在程序中的使用形式#include struct Employee/结构的定义 char*name;char sex;int old;
10、char*tel;char*adr;void main()struct Employee wang,gao;/结构变量的定/义 wang.name=“wang hai”;/结构变量的成/员赋值 wang.sex=M;wang.old=34;wang.tel=010-12345678;wang.adr=beijing;gao.name=gao yang;gao.sex=F;,gao.old=42;gao.tel=021-87654321;gao.adr=shanghai;/显示结构变量的成员内容 printf(name sex old tel addressn);printf(n);printf
11、(%-14s%-4c%-4d%-10s%-20sn,wang.name,wang.sex,wang.old,wang.tel,wang.adr);printf(%-14s%-4c%-4d%-10s%-20sn,gao.name,gao.sex,gao.old,gao.tel,gao.adr);运行结果如下:name sex old tel adrwang hai m 34 010-12345678 beijinggao yang f 42 021-87654321 shanghai,在文件的开始部分定义结构Employee,在函数main的说明部分说明了使用该结构的两个结构变量wang和gao
12、。程序的执行部分由数据赋值和输出两大部分组成。在赋值部分中可以清楚地看到每个成员项的使用形式和使用特性。例如,其中的赋值语句:wang.name=wang jun;由于wang.name是一个char型指针变量,所以可以用一个字符串常量直接向它赋值。再者,从数据输出中看出,输出项wang.name对应输出转换说明符是%s,所以输出结果是指针wang.name所指向的字符串。由此可知,结构的成员项无论其表示形式多么复杂,它的类型和使用特性最终落实到成员名上。例如,成员名name在Employee结构定义时定义为char指针型,那么无论是wang.name、还是gao.name都是char指针型。
13、它们在程序中使用时,与使用一个普通的字符指针完全相同,视作一个整体。,2、结构的初始化 在结构说明的同时,可以给这个结构的每个成员赋初值,这称为结构的初始化。结构初始化的一般形式如下:struct 结构名 结构变量=初始数据;其中大括号中包围的初始数据之间用逗号分隔,初始数据的个数与结构成员项的个数应该相同,它们是按先后顺序一一对应赋值。此外,每个初始数据必须符合与其对应的成员项的数据类型。,例如,前述Employee结构的结构变量wang在说明时可以初始化如下:struct Employee wang=wang hai,M,34,123-1111,beijing;它所实现的功能,与程序中下列
14、赋值相同:wang.name=wang hai;wang.sex=M;wang.old=34;wang.tel=010-12345678;wang.adr=beijing;,8.2 结构数组与结构指针,8.2.1 结构数组 在C语言中,具有相同数据类型的数据可以组成数组,指向相同类型的指针可以组成指针数组。根据同样的原则,具有相同结构的结构也可以组成数组,称它们为结构数组。结构数组的每一个元素都是结构变量。结构数组的说明形式如下:struct 结构名 结构数组名元素个数=初值表;,例如,struct Employee man3;说明了结构数组man,它有三个元素man0、man1和man2,它
15、们都是具有Employee结构的结构变量。结构数组适合于处理由若干具有相同关系的数据组成的数据集合体。与数组一样,在定义结构数组的同时可以用初始化列表给它的每个元素赋初值。在对结构数组进行初始化时,方括号 中的元素个数可以缺省。结构数组也具有数组的属性,结构数组名是结构数组存储首地址,如例中的man表示该结构数组存储首地址。,例8.2 结构数组的使用#include#define STUDENT 3/*用符号常量STUDENT表示学生人数 struct Data/定义一个结构 char name20;/姓名 short age;/年龄 char adr30;/地址 long tel;/电话号码
16、;void main()struct Data manSTUDENT=/*定义一个结构数组并初始化 王伟,20,东八舍416室,87543641,李玲,21,南三舍219室,87543945,张利,19,东八舍419室,87543645;int i;,/输出显示表头提示信息 printf(“编号t姓名t年龄t地 址t电 话nn);/输出结构数组的数据 for(i=0;i STUDENT;i+)printf(%-dt%-st%-dt%-st%Ldn,i+1,mani.name,mani.age,mani.adr,mani.tel);/每个输出项都左对齐,编号从1开始 printf(n结构类型Da
17、ta的数据长度:%d 字节。n,sizeof(struct Data);该程序的输出结果为:编号 姓名 年龄 地 址 电 话1 王伟 20 东八舍416室 875436412 李玲 21 南三舍219室 875439453 张利 19 东八舍419室 87543645结构类型Data的数据长度:56字节。,例8.3:选举,对候选人得票进行统计,设有4个候选人,N个人参加选举,每次输入一个得票的候选人的名字,要求最后输出个人的得票结果。程序如下:#include#include#define N 10/宏定义,定义参加选举人的个数struct person/结构定义 char name20;in
18、t count;void main()/结构数组定义及初始化 struct person leader4=wang,0,zhang,0,zhou,0,gao,0;char name20,i,j;/模拟选举过程,循环一次代表一次选举 for(i=0;iN;i+)gets(name);/从键盘输入候选人的名字 for(j=0;j4;j+)/在候选人中查找匹配的人 if(strcmp(name,leaderj.name)=0),leaderj.count+;/被投票的候选人的票数加1 break;printf(n);for(j=0;j4;j+)/输出选举结果 printf(%s:%dn,leader
19、j.name,leaderj.count);该程序的运行结果为:wangwangzhangzhangzhangzhangzhouzhougaogao/输入wang:2zhang:4zhou:2gao:2/输出,8.2.2 结构指针 在C语言中对于结构的数据可以使用指针进行处理。我们把指向结构的指针称为结构指针。指向结构的指针变量称为结构指针,它与其他各类指针在特性和使用方法上完全相同。结构指针的运算仍按地址计算规则进行,其定义格式为:struct 结构名*结构指针名=初始地址值;其中结构名必须是已经定义过的结构类型。例如:struct Employee*pman;struct Employee
20、*pd;,存储类型是结构指针变量本身的存储类型。编译系统按指定的存储类型为结构指针pman和pd分配内存空间。由于结构指针是指向整个结构体而不是某个成员,因此结构指针的增(减)量运算,例如:“pman+;”将跳过一个结构变量的整体,指向内存中下一个结构变量或结构数组中下一个元素,结构指针本身的(物理)地址增量值取决于它所指的结构变量(或结构类型)的数据长度。,结构体可以嵌套,即结构体成员又是一个结构变量或结构指针。例如:struct student char name20;short age;char adr30;struct Date BirthDay;struct Date StudyDa
21、te;studt300;其中成员项BirthDay、StudyDate是具有Date结构类型的结构变量,称student为外层结构体,Date为内层结构体。,在结构嵌套中,当结构体的成员项具有与该结构体相同结构类型的结构变量或结构指针时,就形成了结构体的自我嵌套。这种结构体称为递归结构体。例如:struct Node int num;/数据场,节点序号 struct Node*next;/指针场,指向下一个节点的结构指针;该结构体中的成员项next是指向自身结构类型Node的结构指针,构成了递归结构体,链表、树和有向图等数据结构中广泛采用递归结构体。,使用结构指针对结构成员进行引用时,有两种形
22、式:(1)使用运算符“.”,这时指针指向结构的成员项一般表示形式是:(*结构指针名).成员名 由于成员选择运算符.的优先级比取内容运算符*“高,所以需要使用圆括号。在C语言程序中结构指针使用相当频繁,所以C中提供了一种直观的特殊运算符:结构指针运算符“-”(横线加大于号)。在C语言程序中经常采用下面的形式。,(2)使用运算符-“结构指针名-成员名 它与前一种表示方法在意义上是完全等价的。例如,前面给出的pman指向的结构中的成员项old可以表示如下:pman-old在这种表示方法中,-(减号和大于号)也是一种运算符,它在第一运算优先级中。它表示的运算意义是,访问指针指向的结构中的成员项。,例8
23、.4:结构指针的使用#include struct Date/定义一个结构 int month;int day;int year;void main()struct Date today,*date_p;/定义一个结构变量和结构指针变量 date_p=程序运行结果:Today is 4/15/1990,例8.5:结构指针运算#include struct Key/定义一个结构char*keyword;int keyno;void main()/定义一个结构数组 struct Key kd=are,123,my,456,you,789;struct Key*p;/定义一个结构指针变量 int a
24、;char chr;p=kd;/将结构数组的首地址赋给结构指针p a=p-keyno;printf(p=%d,a=%dn,p,a);a=+p-keyno;/相当于chr=+(p-keyno),/结构指针无变化 printf(p=%d,a=%dn,p,a);/结构指针指向结构数组的下一个元素,结构指针发生变/化;给a赋值是指针变化后所指向目标的成员数据 a=(+p)-keyno;printf(p=%d,a=%dn,p,a);/给a赋值是指针变化前所指向目标的成员数据;结构指/针值发生变化,结构指针指向结构数组的下一个元素,a=(p+)-keyno;printf(p=%d,a=%dn,p,a);p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构和联合 结构 联合 PPT 课件

链接地址:https://www.31ppt.com/p-5589841.html