《第11章结构体与共同体.ppt》由会员分享,可在线阅读,更多相关《第11章结构体与共同体.ppt(75页珍藏版)》请在三一文库上搜索。
1、结构体与共同体,数据类型分类,数据类型,基本类型,构造类型,指针类型,空类型,数组类型,结构体类型,共同体类型,基本类型数据在内存中开辟一定的空间,与其他变量没有关系。 char c1,c2; int i,j; float f;,c1,c2,i,j,f,数组数据开辟一段连续的空间,以存放一组类型相同的数据。这些类型相同的数组元素之间有一定的联系。 int a3;,a0,而有一些不同类型数据间存在着联系 如一个学生的信息有: 学号、姓名、性别、年龄 显然,这些信息属于不同的数据类型,不能用数组存放。 因为数组内元素类型一致。,想要有联系的存放一个学生的信息 就要将这些不同类型的数据存放到某一个特
2、殊的数据类型中 结构体,C语言允许用户自己指定这样一种数据结构,称为“结构体”(structure) 结构体(structure)是一种数据类型,把互相联系的不同类型的数据组合成一个有机的整体。,相当于用户自己定义了一种数据类型。 C没有提供这种现成的数据类型,必须在程序中建立所需的结构体类型。,任务:建立一个这样的数据类型 根据这种类型定义的每个变量要能够将学生的学号、姓名、性别、年龄、成绩、地址都存放进去,定义一个结构体,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /*
3、 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,声明结构体类型时所必须使用的关键字,结构体类型名,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /
4、* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,成员类型,成员名,结构体中的每一项数据 称为结构体“成员”,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int
5、age; /* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float scor
6、e; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr30; /* 地址 */ ;,struct student int num; /* 学号 */ char name20; /* 姓名 */ char sex; /* 性别 */ int age; /* 年龄 */ float score; /* 成绩 */ char addr30;
7、 /* 地址 */ ;,最后的分号不能省略!,与此同时,名字叫做student的结构体由6个成员组成,struct student,num,name20,sex,age,score,addr30,int,它们共同组成一个新的数据类型 struct student,6个成员有各自的类型,与数组不同的是结构体中的成员或叫做结构体中的元素可以是不同类型的,定义结构体变量,上面是对一个结构体类型的定义。 相当于定义了一个用户自己的存放数据的模型,并没有具体的数据。 struct student的效力和int,char,float效力一样,同属于数据类型。,就是说,我们现在有了一个全新的数据类型stru
8、ct student 这个类型的数据应该是什么样的,应该包括什么,要占多少空间,是由我们自己来定的 struct student,int,char,float,想使用int这种类型的数据,就要在程序中定义一个整型变量。 int i; 要想存放结构体类型的数据,就要在程序中定义这种类型的“结构体变量”。 struct student stu1;,在前面已经定义的结构体struct student的基础上,定义两个结构体变量。 struct student student1,student2;,变量类型,变量名称,int i,j;,变量类型,变量名称,struct student student1
9、;,int a10;,共占内存字节:,2x10=20,共占内存字节:,?,2,1x20,1,2,4,1x30,59,struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student student1,student2;,struct student int num; char name20; char sex; int age; float score; char addr30; student1,student2;,定义结构体同时定义变量,先定义结构体类型后定义
10、变量,结构体变量的两种定义方式,几点注意: struct student不是一个变量, 是一个数据类型! student1,student2才是变量名! 定义类型时不开辟内存,只有在定义变量后系统才分配内存空间。,任务:建立一个用以存放日期的结构体 包括年、月、日,struct date int year; int month; int day; ;,建立一个用以存放产品信息的结构体 包括产品名、产品代号、价格,struct product char name20; int number; float price; ;,建立一个用以存放图书信息的结构体 包括书名、书号、作者、出版社,struc
11、t book char name20; int number; char author20; char publish20; ;,建立一个用以存放空间某个点的结构体 包括三个点的坐标,struct point float x; float y; float z; ;,建立一个结构体,用以在空间中确定某个球 球心和半径,struct globe float x; float y; float z; float r; ;,结构体中的成员可以单独使用,作用与地位相当于普通变量。 成员名可以与程序中变量名相同,互不干扰。 一个结构体中的成员也可以是另外一个结构体变量。,建立一个结构体,用以在空间中确定
12、某个球体 球心和半径,struct globe float x; float y; float z; float r; ;,struct point float x; float y; float z; ;,struct point p1;,struct date int month; int day; int year; ; struct student int num; char name20; char sex; int age; struct date birthday; char addr30; student1, student2;,另外一个结构体变量,num,name20,sex
13、,age,birthday,addr30,month,day,year,结构体变量引用,方式:结构体变量.成员名 student1.num student1.num=1001; 用这种方式可以访问结构体中的成员。 这些成员可以当做普通变量一样使用,在程序中进行各种合法的运算。,struct student student1;,student1.num,student1.age,student1.addr,student1.name,struct student student1;,struct date birthday;,student1.birthday.month,student1.bi
14、rthday.year,main() struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student student1;,scanf(“%d”, ,EXP1100.C,结构体变量初始化,可以在定义时指定初始值 struct student long int num; char name20; char sex; char addr20; a=89031,“Li Lin“,M,“123 Beijing Road“;,EXP1101.C,struct student
15、 long int num=89031; char name20=“Li Lin“; char sex=M; char addr20=“123 Beijing Road“; a;,建立一个结构体变量(当然在这之前要先进行结构体的声明),用以存放一个球员的姓名、号码、年龄、身高、体重、以及在季后赛进总得分、篮板和助攻数。 分别从键盘输入这些信息到结构体变量中 再将这些信息输出,main() struct off int score; int reboard; int assit; ; struct player char name20; int num; int age; float heigh
16、t; float weight; struct off p1; ; struct player player1;,scanf(“%s“,player1.name); scanf(“%d“,printf(“%sn“,player1.name); printf(“%dn“,player1.num); printf(“%dn“,player1.age); printf(“%fn“,player1.height); printf(“%fn“,player1.weight); printf(“%dn“,player1.p1.score); printf(“%dn“,player1.p1.reboard)
17、; printf(“%dn“,player1.p1.assit); getch(); printf(“nn“);,结构体数组,首先,是个数组。 也是由一些元素组成的。 与以前的数值型数组不同的是结构体数组的每个元素都是一个结构体类型的数据。 数组内数据类型要一致指的是数值型数组。,struct student int num; char name20; char sex; int age; float score; char addr30; ; struct student stu3;,结构体数组定义,结构体类型的定义,定义这种结构体类型的数组,10101,10102,10104,Li Lin
18、,Zhang Fun,Wang Min,M,M,F,18,19,20,87.5,99,78.5,103 Beijing Road,130 Shanghai Road,1010 Zhongshan Road,stu0,stu1,stu2,num,name,sex,age,score,addr,stu0,stu1,stu2,各个元素在内存中连续存放,存放这样一个结构体数组用多少个字节连续的内存地址,?,3x59=177,结构体数组初始化,struct student int num; char name20; char sex; int age; float score; char addr30;
19、 stu3=10101,“Li Lin“,M, 18,87.5,“103 Bejing Road“, 10102,“Zhang Fun“,M,19,99,“130 Shanghai Roaad“, 10104,“Wang Min“,F,20,78.5,“1010 Zhongshan Road“;,二维数组初始化 int a33=1,2,3,4,5,6,7,8,9,要求:建立一个结构体数组,数组元素4个,结构体成员包括:学号、姓名、成绩。,struct student int num; char name20; float score; ; struct student stu4;,刚刚定义的这
20、个结构体数组,在内存中是怎么放的?,stu,结构体数组程序举例,用结构体数组存放三个点的坐标。 计算由这三个点所组成的三角型的周长。 并判断这个三角形是否为等腰或等边三角形。,struct point float x; float y; ; struct triangle struct point p3; float a; float b; float c; s;,p3,定义了一个变量s。这个变量是由这些内容组成的,它在内存中的存储方式是这样的:,int i; for(i=0;i3;i+) scanf(“%f“,结构体数组程序举例,对候选人得票的统计程序。 设有三个候选人,每次输入一个得票的候
21、选人的名字,要求最后输出各候选人得票结果。,EXP1102.C,#include “stdio.h“ #include “string.h“ struct person char name20; int count; leader3=“Li“,0,“Zhang“,0,“Fun“,0;,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+; ,for(i=0;
22、i3;i+) printf(“%5s:%dn“, leaderi.name,leaderi.count); getch(); printf(“nn“); ,指向结构体数据的指针变量,结构体变量指针就是该变量所占的内存段的内存起始地址。 结构体变量指针可以用来指向结构体数组中的元素。这些元素都是结构体。 指向的是整个结构体,而不是结构体内的某个成员。,struct student int num; char name20; float score; ;,int a4; int *p;,struct student stu4; struct student *p;,int a4; int *p;,
23、p=a;,struct student stu4; struct student *p;,p=stu;,p+;,?,p=p+2;,?,stu3.num,P,?,(*p).name,?,(*p).name,p=p+;,P,p=p+;,P,p-score,p-score,指向?,例、输入4个学生的学号、姓名、成绩,将成绩最高的学生的所有信息输出。 要用结构体数组、结构体数组指针 步骤: 定义结构体及要应用的变量 输入4个学生的数据 比较并找到成绩最好的学生 将这个学生的所有信息输出,struct student int num; char name20; float score; ;,main()
24、 struct student int num; char name20; float score; ; struct student stu4; struct student *p; int i,temp; float max;,for(i=0;i=max) max=stui.score;temp=i; p=stu+temp; printf(“nNo.%dnName:%snScore:%4.1fn“,p-num,p-name,p-score); ,指针处理链表,用数组存放数据时,必须先定义固定长度的数组。 如果在一开始不能确定数组最大的长度,就要尽可能的把数组定义的大一些。 链表就可以根据需
25、要开辟内存单元。,链表有一个头指针变量,存放一个地址。这个地址指向另外一个元素。 每个元素称为“节点”。 每个节点都包括两部分:用户实际需要的数据和下一个节点地址。 最后一个元素的地址部分为空,不指向任何其他元素。,1249,head,1000,链表中的各个元素在内存中可以不是连续存放的。并且元素存放的顺序也不一定就按内存地址增加的顺序存放。 想要找到某个元素的唯一方法,就只能通过它前面的那个元素的地址寻找。,链表必须有第一个元素开始的头地址。 链表的最后一个元素的指针必须是空。 链表这种数据结构必须利用指针变量才能实现。访问某个元素也必须通过指针变量完成。,共用体,与结构体非常相似,在一个共用体下可以定义不同类型的很多种成员。 不同的是结构体为每个成员都单独开辟存放空间。 而共用体则可以将不同类型的数据都以相同的首地址开始存放。,struct stu int num; char name20; float score; s1;,total:26,union stu int num; char name20; float score; x;,total:20,同一段内存可以存放不同类型的成员。 可是在一瞬间内存中只能存放一种数据。 而不是同时存放几种数据。 在一个瞬时只有一个成员起作用。并且起作用的是最后一次存放的成员。,
链接地址:https://www.31doc.com/p-2250901.html