收藏 分享(赏)

9.C语言结构体.PPT.ppt

上传人:wspkg9802 文档编号:6103400 上传时间:2019-03-27 格式:PPT 页数:47 大小:609.50KB
下载 相关 举报
9.C语言结构体.PPT.ppt_第1页
第1页 / 共47页
9.C语言结构体.PPT.ppt_第2页
第2页 / 共47页
9.C语言结构体.PPT.ppt_第3页
第3页 / 共47页
9.C语言结构体.PPT.ppt_第4页
第4页 / 共47页
9.C语言结构体.PPT.ppt_第5页
第5页 / 共47页
点击查看更多>>
资源描述

1、,第九章,结构体,在前面所见到的程序中,所用的变量大多数是互相独立的、无 内在联系的。例如定义了整型变量a,b,c, 它们都是单独存在 的变量,在内存中的地址也是互不相干的,但在实际生活和工 作中,有些数据是有内在联系的。例如一个学生有学号/姓名/ 性别/年龄/地址等属性,是属于同一个学生的。int num; char name20; char sex; int age; int score; char addr30;,1 概述,如果将 num,name, sex, age,score, addr 分别定义 为互相独立的简单变量,难以反映它们之间的内在联系,而且 这些数据的类型是不相同的。人们

2、要求把这些类型不同的数据组成一个组合数据,如定 义一个名为student_1 的变量,在这个变量中包括学生1的学号、 姓名、性别等信息。这样,使用起来就方便多了。,使用结构体类型处理组合数据 用户自定义数据类型,结构体 结构体是一种构造数据类型 用途:把不同类型的数据组合成一个整体-自定义数据类型 结构体类型定义,struct 结构体名 类型名 成员名;类型名 成员名;. ;,“成员表列”也称为“域表”,成员名命名规则与变量名相同。,struct是关键字, 不能省略,合法标识符,注意最后又一个分号,例 struct student int num;char name20;char sex;in

3、t age;float score;char addr30;,经过上面的指定,struct student就是一个在程序中可以使用的合法类型名,它和系统提供的标准类型(如int,char,float等)具有同样的作用,都可以用来定义变量的类型,只不过int等类型是系统定义的,而结构体类型是由用户根据需要在程序中指定的。,2 定义结构体类型变量的方法,可以采取以下3种方法定义结构体类型变量: (1)先声明结构体类型再定义变量名 例如:struct student student1, student2;| | | 结构体类型名 结构体变量名 定义了student1和student2为struct

4、student类型的变 量,即它们具有struct student类型的结构.,在定义了结构体变量后,系统会为之分配内存单元。 例如:student1和student2在内存中各占59个字节(2+20+1+2+4+30=59)。,(2)在声明类型的同时定义变量这种形式的定义的一般形式为:struct 结构体名成员表列变量名表列;,例如: struct student int num;char name20;char sex;int age;float score;char addr30;student1,student2;,它的作用与第一种方法相同,即定义了两个struct student 类

5、型的变量:student1,student2,(3) 不指定类型名直接定义结构体类型变量 其一般形式为:struct成员表列变量名表列; 即不出现结构体名。,这种形式指定了一个无名的结构体类型,它没有名字。 显然不能再以此结构体类型去定义其他变量。 这种方式用得不多。,例如:struct date /*声明一个结构体类型strcut date*/int month;int day;int year; ; struct student /*声明一个结构体类型strcut student*/ int num;char name20;char sex;int age;struct date birt

6、hday; /*birthday是struct date类型*/char addr30;;,先声明一个struct date类型,它代表“日期”,包括3个成员:month(月)、day(日)、year(年)。然后在声明struct student类型时,将成员birthday指定为struct date类型。 已声明的类型 struct date 与其他类型一样可以用来定义成员的类型。,成员可以是另一个结构体变量,3 结构体变量的初始化 形式一:,struct 结构体名 类型标识符 成员名;类型标识符 成员名;. ; struct 结构体名 结构体变量=初始数据;,例 struct stude

7、nt int num;char name20;char sex;int age;char addr30; struct student stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式二:(用的最多),struct 结构体名 类型标识符 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct student int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,形式三:,struct 类型标识符

8、 成员名;类型标识符 成员名;. 结构体变量=初始数据;,例 struct int num;char name20;char sex;int age;char addr30;stu1=112,“Wang Lin”,M,19, “200 Beijing Road”;,例 对结构体变量初始化. #include void main() struct student int num;char name20; char sex; char addr20; a=10101,LiLin,M,123 Beijing Road; /* 对结构体变量a赋初值*/ printf(No.:%dnname:%snse

9、x:%cnaddress:%sn, a.num,a.name,a.sex,a.addr); ,运行结果: No.:10101 name:LiLin sex: address:123 Beijing Road,4 结构体变量的引用,在定义了结构体变量以后,当然可以引用这个变量。 但应遵守以下规则: (1)不能将一个结构体变量作为一个整体进行输入和输出。 例如: 已定义student1和student2为结构体变量并且它们已有值。 printf(%d,%s,%c,%d,%f,%n,student1);,引用结构体变量中成员的方式为 结构体变量名.成员名 例如: student1.num表示stud

10、ent1变量中的 num成员,即student1的num(学号)项。可以对变 量的成员赋值,例如:student1.num=10010; “.”是成员(分量)运算符,它在所有的运算符中优 先级最高,因此可以把student1.num作为一个整 体来看待。上面赋值语句的作用是将整数10010 赋给student1变量中的成员num。,(2) 如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低的一级的成员。只能对最低级的成员进行赋值或存取以及运算。 例如: 对上面定义的结构体变量student1, 可以这样访问各成员:student1.numstudent1.birthda

11、y.month,注意:不能用student1.birthday来访问student1变量中的成员birthday,因为birthday本身是一个结构体变量。,(3) 对结构体变量的成员可以像普通变量一样进行各种运算(根据其类型决定可以进行的运算)。 例如: student2.score=student1.score;sum=student1.score+student2.score;student1.age+; +student2.age;,由于“”运算符的优先级最高,因此 student 1.age+ 是对student 1.age进行自加运算,而不是先对age进行自加运算。,(4) 可以引

12、用结构体变量成员的地址,也可以引用结构体变量的地址。 例如:scanf(%d, (输入student1.num的值)printf(%o,student1); (输出student1的首地址),但不能用以下语句整体读入结构体变量, 例如:scanf(%d,s,c,d,f,s,student1);,5 结构体数组,一个结构体变量中可以存放一组数据(如一 个学生的学号、姓名、成绩等数据)。如果有 个学生的数据需要参加运算,显然应该用 数组,这就是结构体数组。结构体数组与以前 介绍过的数值型数组不同之处在于每个数组元 素都是一个结构体类型的数据,它们都分别包 括各个成员(分量)项。,定义结构体数组 和

13、定义结构体变量的方法相仿,只需说明其为数组即可。例如: struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu3;,以上定义了一个数组stu,数组有个元素,均为struct student类型数据。,也可以直接定义一个结构体数组,例如:struct studentint num;stu3;,图11-4,结构体数组的初始化与其他类型的数组一样,对结构体数组可以初始化 例如: struct student int num;char name20; char sex;

14、 int age; float score; char addr30;;stu210101,LiLin,M,18,87.5,103 BeijingRoad,10102,Zhang Fun,M,19,99,130 Shanghai Road;,图11-5,当然,数组的初始化也可以用以下形式: struct studentint num; ;struct student str=,; 即先声明结构体类型,然后定义数组为该结构体 类型,在定义数组时初始化。,结构体数组初始化的一般形式是在定义数组的后面加上“初值表列;”。,结构体数组应用举例,例 对候选人得票的统计程序。设有3个候选人,每次输入一个得

15、票的候选人的名字,要求最后输出各人得票结果。 #include #include struct person char name20; int count; leader3=“Li”,0,“ Zhang”,0,“ Fan”,0; /*定义结构体数组并初始化*/,void main() int i,j; char leader_name20; for(i=1;i=10;i+) scanf(“%s”,leader_name); for(j=0;j3;j+) if(strcmp(leader_name,leaderj.name)=0) leaderj.count+; printf(“n”); for

16、(i=0;i3;i+) printf(“%5s:%dn”,leaderi.name,leaderi.count);,运行结果:aaa Resoult:a:,程序定义一个全局的结构体数组leader,它有个元素,每 一个元素包含两个成员name(姓名)和count(票数)。在定义数 组时使之初始化,使3位候选人的票数都先置零。,在主函数中定义字符数组leader-name,它代表被选人的姓 名,在10次循环中每次先输入一个被选人的具体人名,然后把它 与3个候选人姓名相比,看它和哪一个候选人的名字相同。在输入 和统计结束之后,将3人的名字和得票数输出。,6 指向结构体类型数据的指针,一个结构体变量

17、的指针就是该变量所占据的内 存段的起始地址。可以设一个指针变量,用来指向 一个结构体变量,此时该指针变量的值是结构体变 量的起始地址。指针变量也可以用来指向结构体数 组中的元素。 指向结构体变量的指针 下面通过一个简单例子来说明指向结构体变量的 指针变量的应用。,例 指向结构体变量的指针的应用 #include #include void main() struct studentlong num; char name20; char sex; float score; struct student stu_1; struct student * p; p= ,定义指针变量p,指向struct

18、 student 类型的数据,指向的结构体变量中的成员,运行结果: :89101 name:LiLin sex: score:89.500000 :89101 name:LiLin sex: score:89.500000,程序分析:在函数的执行部分将结构体变量stu_1的起始地址赋给指针变量,也就是使指向stu_1,然后对stu_1的各成员赋值。第一个printf函数是输出stu_1的各个成员的值。用stu_1.num表示stu_1中的成员num,依此类推。第二个printf函数也是用来输出stu_1各成员的值,但使用的是(*).num这样的形式。,图11-7,为了使用方便和直观,C语言允许

19、把(*p).num 改用p-num来代替,它表示p所指向的结构体 变量中的num成员。 以下3种形式等价: 1. 结构体变量成员名 2.(*)成员名 3.-成员名 其中-称为指向运算符。 指向结构体变量的指针变量,也可以用来指向结构体 数组元素。,请分析以下几种运算: -得到指向的结构体变量中的成员的值。 - 得到指向的结构体变量中的成员的值,用完该值后使它加。 - 得到指向的结构体变量中的成员的值加,然后再使用它。,例 指向结构体数组的指针的应用 #include struct student int num;char name20;char sex;int age; struct stud

20、ent stu3=10101,”Li Lin”,M,18, 10102,”Zhang Fun”,M,19, 10104,”WangMing”,F,20; void main() struct student *p; printf( No. Name sex age); for(=stu;num, p-name, p-sex, p-age); ,运行结果: LiLin 18 Zhang Fun 19 WangMing 20,注意:(1) 如果的初值为stu,即指向第一个元素,则加后p就指向下一个元素。例如: (+p)-num 先使自加,然后得到它指向的元素中的num成员值(即10102)。 (p

21、+)-num 先得到-num的值(即10101),然后使自加,指向stu1。请注意以上二者的不同。,图11-8,注意: (2) 程序已定义了是一个指向struct student类型数据的指针变量,它用来指向一个struct student类型的数据,不应用来指向stu数组元素中的某一成员。 例如: p=stu1.name;如果要将某一成员的地址赋给p,可以用强制类型转换,先将成员的地址转换成p的类型。 例如: p=(struct student*)stu0.name;,7 用结构体变量和指向结构体的指针作函数参数 将一个结构体变量的值传递给另一个函数,有3个方法:(1)用结构体变量的成员作参

22、数。例如,用stu1.num或stu2.name作函数实参, 将实参值传给形参。其用法和用普通变量作实参是一样 的,属于“值传递”方式。应当注意实参与形参的类型保 持一致。,将一个结构体变量的值传递给另一个函数,有3个方法: (2)用结构体变量作实参。用结构体变量作实参时,采取的也是“值传递”方 式,将结构体变量所占的内存单元的内容全部顺序传递 给形参,形参也必须是同类型的结构体变量。这种传递 方式在空间和时间上开销较大,因此一般较少采用这种 方法。(3)用指向结构体变量(或数组)的指针作实参,将 结构体变量(或数组)的地址传给形参。,例 有N个结构体变量stu,内含学生学号、姓名和3门课程的

23、成绩,要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)。,解题思路: 按照功能函数化的思想,分别用3个函数来实现不同的功能: (1)用input函数来输入数据和求各学生平均成绩。 (2)用max函数来找平均成绩最高的学生。 (3)用print函数来输出成绩最高学生的信息。 在主函数中先后调用这3个函数,用指向结构体变量的指针作实参,最后得到结果。,#include #define N 3 /学生数为3 struct student /声明结构体类型 struct student int num; /学号char name20; / 姓名 float score3; /

24、 3门课成绩float aver; ; / 平均成绩 void main() void input(struct student stu); /函数声明struct student max(struct student stu);void print(struct student stu);struct student stuN, *p=stu; /定义结构体变量和指针input(p); /调用input函数print(max(p); /调用print函数,以max函数的返回值为实参 ,void input(struct student stu) int i;printf(“请输入各学生的信息:学号、姓名、三门课成绩:n”);for(i=0;iN;i+) scanf(“%d %s %f %f %f”, /求各人平均成绩 ,

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

当前位置:首页 > 网络科技 > C/C++资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报