《第8章结构和联合优秀PPT.ppt》由会员分享,可在线阅读,更多相关《第8章结构和联合优秀PPT.ppt(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第8章 结构和联合现在学习的是第1页,共41页本章要点nC语言的结构类型。n结构数组。n指向结构的指针。nC语言的动态数据结构。n联合类型。本章难点n结构指针和C语言的动态数据结构。现在学习的是第2页,共41页8.1 结构的说明和引用8.2 结构的指针8.3 结构和函数8.4 结构数组8.5 结构和指针的应用8.6 联合(共用体)8.7 用typedef定义类型名 现在学习的是第3页,共41页8.1 结构的说明和引用 n在实际中常常描述同一对象的不同属性,如一个学生有学号、姓名、性别、年龄、各科分数,表示这些属性的数据具有不同的类型,因而不能用数组表示。C语言提供了一种数据结构,可以把这些不同
2、类型的数据组成一个整体,这就是结构类型。n结构类型是各种结构的总称,是一种构造类型。一个结构变量可以由不同类型的成员变量组成,这些成员变量又称为结构的域、分量。结构的所有成员除自身的名字外,还拥有共同的名字,即结构变量名。现在学习的是第4页,共41页8.1.1 结构说明8.1.2 结构的引用 现在学习的是第5页,共41页8.1.1 结构说明 struct 结构体名 数据类型1 成员名1;数据类型2 成员名2;数据类型n 成员名n;结构体类型定义的一般形式:nstructstruct为关键字;为关键字;n结结构构体体名名是是用用户户定定义义的的类类型标识型标识。n 中中是是组组成成该该结结构构体
3、体的的成成员员。成成员员的的数数据据类类型型可可以以是是C语语言言所所允允许许的的任任何何数据类型数据类型。现在学习的是第6页,共41页n在定义结构体类型的同时定义变量例如:struct student char num8,name20,sex;int age;float score;st30;struct 结构体名 成员定义表;变量名表;现在学习的是第7页,共41页n直接定义结构体类型变量 例如:struct char num8,name20,sex;int age;float score;st30,a,b,c;struct 成员定义表;变量名表;现在学习的是第8页,共41页n在结构的说明中
4、,结构成员可以为任何类型且结构成员还可以和结构外部的其它变量同名,不同结构的成员也可以同名,但同一结构的成员不能同名。现在学习的是第9页,共41页n例如学生类型的定义:例如学生类型的定义:struct student char num8;/*学号是字符数组类型学号是字符数组类型*/char name30;/*姓名是字符数组类型姓名是字符数组类型*/char sex;/*性别是字符型性别是字符型*/int age;/*年龄是整型年龄是整型*/char addr60;/*住址是字符数组类型住址是字符数组类型*/int score6;/*成绩是整型数组类型成绩是整型数组类型*/;现在学习的是第10页
5、,共41页n利用已定义的结构体类型名定义变量 struct 结构体名 变量名表;例如:struct student s30,t1,t2;按按照照结结构构体体类类型型的的组组成成,系系统统为为定定义义的的结结构构体体变变量量分分配配内内存存单单元元。结结构构体体变变量量的的各各个个成成员员在在内内存存中中占占用用连连续续存存储储区区域域,结结构构体体变变量量所所占占内内存存大大小小为为结结构构体体中中每每个成员个成员所占用内存的所占用内存的长度之和长度之和。struct studentnum8个字节name30个字节sex1个字节age4个字节addr60个字节score24个字节现在学习的是第
6、11页,共41页8.1.2 结构的引用 1结构的初始化 结构变量在说明时可以初始化,初值是由常量表达式组成的初值表。例如,struct student char name10;short sex;int age;float score;student1“zhangsan”,1,20,88.8;现在学习的是第12页,共41页2结构变量的引用 对结构变量的引用只允许下列5种情况:(1)同类型的结构变量相互赋值。例如 student2=student1;(2)函数返回的结构成员给同类型的结构变量。(3)对结构变量取地址。例如&student1是结构student1的地址,与第一个成员的地址值相同。(
7、4)结构变量作为函数的参数和函数的返回值。(5)用于引用结构的成员。现在学习的是第13页,共41页3结构成员的引用 结构成员的引用通过“”运算符构成的表达式。结构变量名成员名结构变量名成员名其中“”称为结构成员运算符。连接结构变量名和成员名,属于最高级运算符。例如student.sex=1;student.sex=0;scanf(“%s”,student1.name);但student1.name=”zhang san”;则为非法。现在学习的是第14页,共41页4嵌套的结构 结构的一个成员可以是一个结构,含有结构成员的结构称为嵌套的结构。现在学习的是第15页,共41页 struct date
8、int year,month,day;struct student char num8;char name30;char sex;struct datestruct date birthday;/*成员为结构体类型成员为结构体类型*/char addr60;int score6;num8个字节name30个字节sex1个字节birthdayyear2个字节month2个字节day2个字节addr60个字节score12个字节现在学习的是第16页,共41页例:输入三个人的信息,求其总成绩。n#include nvoid main()nstruct studn char name20;n int
9、age;n char sfzh20;n float zcj;na,b,c;n float zcj;n printf(请输入第一个人的信息:name,age,sfzh,zcj:n);nscanf(%s%d%s%f,a.name,&a.age,a.sfzh,&a.zcj);nprintf(请输入第二个人的信息:name,age,sfzh,zcj:n);nscanf(%s%d%s%f,c.name,&b.age,b.sfzh,&b.zcj);nprintf(请输入第三个人的信息:name,age,sfzh,zcj:n);nscanf(%s%d%s%f,c.name,&c.age,c.sfzh,&c.
10、zcj);nprintf(第一个人的信息是:);nprintf(%s%d%s%f,a.name,a.age,a.sfzh,a.zcj);n zcj=a.zcj+b.zcj+c.zcj;nprintf(总成绩:%fn,zcj);n现在学习的是第17页,共41页8.2 结构的指针 n 指向结构的指针(或称结构指针)可以用来引用结构的成员,可以作为参数传给函数,也可以作为函数的返回值。1结构指针的说明 指向结构的指针使用之前也要进行说明,例如 struct date int year,month,day;d,*p=&d;现在学习的是第18页,共41页n用结构体变量名的引用形式:d.year d.mo
11、nth d.dayn 用结构体指针变量的引用形式:(*p).year (*p).month (*p).day p-year p-month p-day 注意:成员引用表达式中的()不能省,如(*pd).day不能写成*pd.day,因为“.”运算符的优先级高于*,所以*pd.day等同于*(pd.day),在该例中为非法操作。结构成员运算符“-”和“.”的优先级相同,它们与()、属于同一优先级,按从左到右结合。现在学习的是第19页,共41页8.3 结构和函数 1结构作函数的参数结构作函数的参数有三种可能的方法。(1)传一个结构成员(用结构成员作实参);(2)传整个结构(用结构变量名作实参);(
12、3)传结构的指针(用结构的地址或指向结构的指针作实参)。我们推荐使用第三种方法。函数的返回值为结构变量或指向结构变量的指针。现在学习的是第20页,共41页已定义在comp.h中。struct complex float re;/*实部*/float im;/*虚部*/;【例8.3】写一个函数计算两个复数的和。#include comp.hstruct complex*addcomp(struct complex c1,struct complex c2)static struct complex temp;temp.re=c1.re+c2.re;temp.im=c1.im+c2.im;retu
13、rn(&temp);现在学习的是第21页,共41页8.4 结构数组8.4.1 结构数组的说明,引用和初始化8.4.2 结构数组作函数参数8.4.3 sizeof运算符8.4.4 用结构的指针引用结构数组的成员现在学习的是第22页,共41页8.4.1 结构数组的说明、引用和初始化 结构数组是其元素都是具有相同结构体类型的结构体变量。定义的一般格式为:struct 结构体名 结构体数组名元素个数,结构体数组名元素个数,;其中,“struct 结构体名”是已定义过的结构体类型。因此定义结构体数组和定义结构体变量的方法相仿,只需说明其为数组即可。现在学习的是第23页,共41页例如:struct stu
14、dent int num;char name10;char sex;int age;float score;char addr30;struct student stu3;以上定义了一个数组stu,其元素为struct student类型数据,数组有3个元素。现在学习的是第24页,共41页2、结构体数组的初始化 一个外部的或静态的结构体数组在定义的同时可以初始化。其一般格式是在定义之后紧跟一个用花括号括起来的一组初始化数据:struct 结构体名 结构体数组名=初始数据表列;其中,“struct 结构体名”是已定义过的结构体类型。现在学习的是第25页,共41页【例8.6】对候选人得票的统计程序
15、。设有三个侯选人,每次输入一个得票的候选人的名字,要求最后输出各人得票结果。#include#include“string.h”struct personchar name18;int count;leader3=Li,0,Zhang,0,Wang,0;现在学习的是第26页,共41页void main()int i,j;char leader_name18;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(i
16、=0;i3;i+)printf(%5s,%dn,leaderi.name,leaderi.count);现在学习的是第27页,共41页8.4.2 结构数组作函数参数 n类似于整型数组现在学习的是第28页,共41页8.4.3 sizeof运算符 nsizeof是一个单目运算符,用于计算一个对象的大小,它是在编译时执行的运算,所以sizeof表达式是一个常量表达式,sizeof表达式有两种形式:sizeof表达式或 sizeof(表达式)sizeof(类型名)现在学习的是第29页,共41页【例】利用结构体指针输出一组化学元素名称及其原子量。struct list int i;char name4;
17、float w;tab4=1,H,1.008,2,He,4.0026,3,Li,6.941,4,Be,9.01218;tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.012188.4.4 用结构的指针引用结构数组的成员现在学习的是第30页,共41页main()struct list *p;printf(NotNametAtomic Weightn);for(p=tab;pi,p-name,p-w);tab数组1Htab01.0082Hetab14.00263Litab26.9414Betab39.01218pppppNo Name Atomi
18、c WeightNo Name Atomic Weight1 H 1.0082 He 4.00263 Li 6.9414 Be 9.01218现在学习的是第31页,共41页 链表是一种动态数据结构,可根据需要动态地分链表是一种动态数据结构,可根据需要动态地分配存储单元。在数组中,插入或删除一个元素都比配存储单元。在数组中,插入或删除一个元素都比较繁琐,而用链表则相对容易。但是数组元素的引较繁琐,而用链表则相对容易。但是数组元素的引用比较简单,对于链表中结点数据的存取操作则相用比较简单,对于链表中结点数据的存取操作则相对复杂。对复杂。链表中每个元素称为一个结点。构成链表的结点必须是结构体类型数据
19、。head 1000 1032 3284 1296 1382 2008动态单向链表示意图动态单向链表示意图C3284H1296A1382I2008NNULLNULL10001032 相邻结点的地址不一定是连续的,依靠指针将 它们连接起来。struct nodechar c;struct node *next;8.5 结构指针的应用现在学习的是第32页,共41页 C语语言提供了相关的存言提供了相关的存储储管理管理库库函数。函数。这这里里仅仅介介绍绍其中三个,它其中三个,它们们的原型的原型说说明在明在“stdlib.h”头头文件文件和和“malloc.h”头头文件中,使用文件中,使用这这三个函数三
20、个函数时时,应选应选择择其中一个其中一个头头文件包含到源程序中。文件包含到源程序中。动态分配存储区函数malloc()函数原型:void*malloc(unsigned size);调用格式:malloc(size)功能:在内存分配一个size字节的存储区。调用 结果为新分配的存储区的首地址,是一个void 类型指针。若分配失败,则返回NULL(即0)。在ANSI C标准中,关键字void有两种用法。第一种用法,可将无返回值的函数定义为void类型第二种用法,用void*定义指针,这是一个指向非具体数据类型的指针,称为无类型指针。动态分配和释放存储单元现在学习的是第33页,共41页【例】调用m
21、alloc函数分配所需存储单元。#include main()struct st int n;struct st*next;*p;p=(struct st*)malloc(sizeof(struct st);p-n=5;p-next=NULL;printf(p-n=%dtp-next=%xn,p-n,p-next);将函数返回值转换成将函数返回值转换成结构体指针结构体指针 现在学习的是第34页,共41页 动态分配存储区函数calloc()函数原型:void*calloc(unsigned int n,unsigned int size);调用格式:calloc(n,size)功能:在内存分配一
22、个n倍size字节的存储区。调用结果为新分配的存储区的首地址,是一个void类型指针。若分配失败,则返回NULL(即0)。现在学习的是第35页,共41页【例】调用calloc函数分配所需存储单元。#include main()int i,*ip;ip=(int*)calloc(10,4);for(i=0;i10;i+)scanf(%d,ip+i);for(i=0;i成员名 (*指向联合的指针).成员名 注意:联联合合成成员员彼彼此此不不是是并并存存的的,任任一一时时刻刻联联合合变变量量中中指指含含有有其其中中一一个个成成员员,该成员是最最近近一次存入联合的那一个成为当前成员。现在学习的是第40页,共41页8.7 用typedef定义类型名 ntypedef说明用于为已存在的类型名定义一个别名。typedef说明的一般形式 typedef类型区分符 说明符表;n其中,说明符表中的说明符是类型定义名。类型区分符可以是任何基本类型、结构或联合类型区分符,也可以是由typedef定义的类型名。为了醒目,一般由typedef定义的类型名使用大写,例如 typedefint LENGTH;定义LENGTH是int的别名,它可以和int一样说明变量或函数。现在学习的是第41页,共41页