结构体和共用体.ppt
《结构体和共用体.ppt》由会员分享,可在线阅读,更多相关《结构体和共用体.ppt(93页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材结构体和共用体 Still waters run deep.流静水深流静水深,人静心深人静心深 Where there is life,there is hope。有生命必有希望。有生命必有希望普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 8.1 结构体结构体 8.2 动态内存分配与链表动态内存分配与链表 8.3 共用体类型共用体类型 8.4 枚举类型枚举类型 8.5 用户自定义类型用户自定义类型 8.6 程序举例程序举例第第8章章 结构体和共用体结构体和共用体普通高等教育普通高等教育“十一五十一五”国
2、家级规划教材国家级规划教材普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材 8.1 结结 构构 体体普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体8.1.1 结构类型定义结构类型定义 在在实实际际问问题题中中,一一组组数数据据往往往往具具有有不不同同的的数数据据类类型型。例例如如,在在学学生生登登记记表表中中,姓姓名名应应为为字字符符型型;学学号号可可为为整整型型或或字字符符型型;年年龄龄应应为为整整型型;性性别别应应为为字字符符型型;成成绩绩可可为为整整型型或或实实型型。但但这这些些显显然然不不能能用用一一个个数数组组来来存存放放
3、这这一一组组数数据据。因因为为数数组组中中各各元元素素的的类类型型和和长长度度都都必必须须一一致致,以以便便于于编编译译系系统统处处理理。为为了了解解决决这这个个问题,语言中给出了另一种构造数据类型问题,语言中给出了另一种构造数据类型“结构体结构体”。“结结构构体体”是是一一种种构构造造类类型型,它它是是由由若若干干“成成员员”组组成成的的。每每一一个个成成员员可可以以是是一一个个基基本本数数据据类类型型或或者者又又是是一一个个构构造造类类型型。结结构构体体既既然然是是一一种种“构构造造”而而成成的的数数据据类类型型,那那么么在在说说明明和和使使用用之之前前必必须须先先定定义义它它,也也就就是
4、是构构造造它它。如如同同在在说说明明和和调调用用函函数数之前要先定义函数一样。之前要先定义函数一样。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体 定义一个结构体类型的一般形式为:定义一个结构体类型的一般形式为:struct 结构体名结构体名 结构成员的说明结构成员的说明;成员表由若干个成员组成,每个成员都是该结构体的一个组成成员表由若干个成员组成,每个成员都是该结构体的一个组成部分。对每个成员也必须作类型说明,其形式为:部分。对每个成员也必须作类型说明,其形式为:类型说明符类型说明符 成员名成员名;成员名的命名应符合标识符的书写规定。例如:成员名的命
5、名应符合标识符的书写规定。例如:struct stu int num;char name20;char sex;float score;普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体 在在这这个个结结构构体体定定义义中中,结结构构体体名名为为stu,该该结结构构体体由由4个个成成员员组组成成。第第一一个个成成员员为为num,整整型型变变量量;第第二二个个成成员员为为name,字字符符数数组组变变量量;第第三三个个成成员员为为sex,字字符符变变量量;第第四四个个成成员员为为score,实实型型变变量量。应应注注意意在在括括号号“”后后的的分分号号是是不
6、不可可少少的的。结结构构体体定定义义之之后后,即即可可进进行行变变量量说说明明。凡凡说说明明为为结结构构体体stu的的变变量量都都由由上上述述4个个成成员员组组成成。由由此此可可见见,结结构构是是一一种种复复杂杂的的数数据类型,是数目固定,类型不同的若干有序变量的集合。据类型,是数目固定,类型不同的若干有序变量的集合。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体8.1.2 结构体类型变量的说明结构体类型变量的说明 说明结构体变量有以下三种方法。以上面定义的说明结构体变量有以下三种方法。以上面定义的stu为例来加以说明。为例来加以说明。(1)先定义结构
7、体类型,再说明结构体变量)先定义结构体类型,再说明结构体变量 例如:例如:struct stu int num;char name20;char sex;float score;struct stu boy1,boy2;说说明明了了两两个个变变量量boy1和和boy2为为stu结结构构类类型型。也也可可以以用用宏宏定定义义使使用用一一个个符符号号常常量来表示一个结构类型,例如:量来表示一个结构类型,例如:#define STU struct stu STU int num;char name20;char sex;float score;STU boy1,boy2;普通高等教育普通高等教育“十
8、一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体(2)在定义结构体类型的同时说明结构体变量)在定义结构体类型的同时说明结构体变量 例如例如:struct stu int num;char name20;char sex;float score;boy1,boy2;(3)直接说明结构体变量)直接说明结构体变量 例如例如:struct int num;char name20;char sex;float score;boy1,boy2;普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体 第第三三种种方方法法与与第第二二种种方方法法的的区区别别在在于
9、于第第三三种种方方法法中中省省去去了了结结构构体体名名,而而直直接接给给出出结结构构体体变变量量。三三种种方方法法中中说说明明的的boy1,boy2变变量量都都具具有有相相同同的的结结构构。说说明明了了boy1,boy2变变量量为为stu类类型型后,即可向这两个变量中的各个成员赋值。后,即可向这两个变量中的各个成员赋值。在在上上述述stu结结构构体体定定义义中中,所所有有的的成成员员都都是是基基本本数数据据类类型型或或数数组组类类型型。成成员员也也可可以以又又是是一一个个结结构构体体类类型型,即即构构成成了了嵌嵌套套的的结构体。结构体。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家
10、级规划教材8.1 结构体结构体例如:例如:struct date int month;int day;int year;struct int num;char name20;char sex;struct date birthday;float score;boy1,boy2;首首先先定定义义一一个个结结构构体体date,由由month(月月)、day(日日)、year(年年)三三个个成成员员组组成成。在在定定义义并并说说明明变变量量 boy1 和和 boy2 时时,其其中中的的成成员员birthday被被说说明明为为data结结构构体体类类型型。成成员员名名可可与与程程序序中中其其它它变变量
11、量同同名名,互互不不干干扰扰。结结构构体体变变量量成成员员的的表表示示方方法法,在在程程序序中中使使用用结结构构体体变变量量时时,往往不把它作为一个整体来使用。,往往不把它作为一个整体来使用。说说明明:结结构构体体在在内内存存中中存存储储容容量量是是各各成成员员容容量量之之和和,这这是是与与后后面面联合体的重要区别。联合体的重要区别。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体8.1.3 结构体变量的引用结构体变量的引用 一一般般情情况况下下,不不能能对对一一个个结结构构体体变变量量作作为为整整体体引引用用,只只能能引用其中的成员。结构体变量中成员引
12、用的一般形式为:引用其中的成员。结构体变量中成员引用的一般形式为:结构体变量名结构体变量名.成员名成员名其其中中,“.”是是域域成成员员运运算算符符,是是C语语言言中中优优先先级级最最高高的的运运算算符符之一。之一。例例如如:boy1.num 即即第第一一个个人人的的学学号号,boy2.sex 即即第第二二个个人人的的性性别别。如如果果成成员员本本身身又又是是一一个个结结构构体体,则则必必须须逐逐级级找找到到最最低低级的成员才能使用。级的成员才能使用。例例如如:boy1.birthday.month 即即第第一一个个人人出出生生的的月月份份。成成员员可以在程序中单独使用,与普通变量完全相同。可
13、以在程序中单独使用,与普通变量完全相同。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体8.1.4 结构体变量的赋值结构体变量的赋值对于结构体变量,只有以下两种情况可以对结构体变量赋值。对于结构体变量,只有以下两种情况可以对结构体变量赋值。(1)结构体变量整体赋值)结构体变量整体赋值 例如:例如:boy2=boy1;(2)取结构体变量地址)取结构体变量地址 例如:例如:&boy2;&boy1;注注意意:结结构构体体变变量量名名是是地地址址常常量量,含含义义与与数数组组名名和和函函数数名名相相同同,不能对结构体变量做整体输入不能对结构体变量做整体输入/输出
14、。例如:输出。例如:scanf(%d,%s,%c,%f,&boy1);printf(%d,%s,%c,%f,boy1);这些语句都是不允许的,只能对结构体成员进行输入这些语句都是不允许的,只能对结构体成员进行输入/输出。输出。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体例例8.1 给结构体变量赋值并输出其值。给结构体变量赋值并输出其值。#include void main()struct stu /*定义结构体定义结构体stu*/int num;char*name;char sex;float score;boy1,boy2;/*定义定义stu类型的
15、变量类型的变量boy1、boy2*/boy1.num=102;boy1.name=Zhang ping;printf(input sex and score:n);scanf(%c%f,&boy1.sex,&boy1.score);/*给给boy1的成员的成员sex和和score赋值赋值*/boy2=boy1;/*把把boy1整体赋给整体赋给boy2*/printf(number=%dnname=%sn,boy2.num,boy2.name);printf(sex=%cnscore=%6.2fn,boy2.sex,boy2.score);普通高等教育普通高等教育“十一五十一五”国家级规划教材国
16、家级规划教材8.1 结构体结构体程序运行结果:程序运行结果:input sex and score:M 96 number=102name=Zhang pingsex=Mscore=96.00 本本程程序序中中用用赋赋值值语语句句给给num和和name两两个个成成员员赋赋值值,name是是一一个个字字符符串串指指针针变变量量。用用scanf()函函数数动动态态地地输输入入sex和和score成成员员值值,然然后后把把boy1的的所所有有成成员员的的值值整整体体赋赋予予boy2。最最后后分分别别输出输出boy2 的各个成员值。的各个成员值。普通高等教育普通高等教育“十一五十一五”国家级规划教材国
17、家级规划教材8.1 结构体结构体8.1.5 结构体变量的初始化结构体变量的初始化 如如果果结结构构体体变变量量为为全全局局变变量量或或者者静静态态变变量量,则则可可以以对对它它做做初初始始化化赋赋值值。对对局局部部或或自自动动结结构构体体变变量量不不能能做初始化赋值。做初始化赋值。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体例例8.2 外部结构体变量初始化。外部结构体变量初始化。#include struct stu /*定义结构体定义结构体*/int num;char*name;char sex;float score;boy2,boy1=102,
18、Zhang ping,M,78.5;/*对变量对变量boy1的成员初始化的成员初始化*/void main()boy2=boy1;/*把把boy1整体赋给整体赋给boy2*/printf(number=%dnname=%sn,boy2.num,boy2.name);printf(sex=%cnscore=%6.2fn,boy2.sex,boy2.score);普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体程序运行结果:程序运行结果:number=102name=Zhang pingsex=Mscore=78.50 本本程程序序中中,boy2,boy1均
19、均被被定定义义为为外外部部结结构构体体变变量量,并并对对boy1作作了了初初始始化化赋赋值值。在在main()函函数数中中,把把boy1的的值值整整体体赋予赋予boy2,然后用两个,然后用两个printf()语句输出语句输出boy2各成员的值。各成员的值。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体例例8.3 静态结构体变量初始化。静态结构体变量初始化。#include void main()static struct stu /*定义静态结构体定义静态结构体*/int num;char*name;char sex;float score;boy2,
20、boy1=102,Zhang ping,M,78.5;/*对变量对变量boy1的成员初始化的成员初始化*/boy2=boy1;printf(number=%dnname=%sn,boy2.num,boy2.name);printf(sex=%cnscore=%6.2fn,boy2.sex,boy2.score);本程序是把本程序是把boy1,boy2都定义为静态局部的结构体变量,同都定义为静态局部的结构体变量,同样可以做初始化赋值。样可以做初始化赋值。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体8.1.6 结构体数组结构体数组 一一个个结结构构体体变
21、变量量可可以以处处理理一一个个对对象象,如如果果有有多多个个对对象象,则则需需要要多多个个结结构构体体变变量量,数数组组的的元元素素也也可可以以是是结结构构体体类类型型的的,因因此此可可以以构构成成结结构构体体数数组组。结结构构体体数数组组的的每每一一个个元元素素都都是是具具有有相相同同结结构构体体类类型型的的下下标标结结构构体体变变量量。在在实实际际应应用用中中,经经常常用用结结构构体体数数组组来来表表示示具具有有相相同同数数据据结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。结构的一个群体。如一个班的学生档案,一个车间职工的工资表等。结构体数组的定义方法和结构体变量相似,也有三
22、种方式:结构体数组的定义方法和结构体变量相似,也有三种方式:(1)先定义)先定义结构体类型,再定义结构体数组。结构体类型,再定义结构体数组。例如:例如:struct stu int num;char*name;char sex;float score;;struct stu boy5;定定义义了了一一个个结结构构体体数数组组boy,共共有有5个个元元素素,boy0boy4。每每个数组元素都具有个数组元素都具有struct stu的结构体形式。的结构体形式。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体(2)在定义)在定义结构体类型的同时定义结构体数组。
23、结构体类型的同时定义结构体数组。例如:例如:struct stu int num;char*name;char sex;float score;boy5;(3)直接定义)直接定义结构体数组。结构体数组。例如:例如:struct int num;char*name;char sex;float score;boy5;普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体 对对外外部部结结构构体体数数组组或或静静态态结结构构体体数数组组可可以以做做初初始始化化赋赋值值。例如:例如:struct stu int num;char*name;char sex;floa
24、t score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;当对全部元素做初始化赋值时,也可不给出数组长度。当对全部元素做初始化赋值时,也可不给出数组长度。普通高等教育普通高等教育“十一五十一五”国家级规划教材国家级规划教材8.1 结构体结构体例例8.4 计算学生的平均成绩和不及格的人数。计算学生的平均成绩和不及格的人数。#include struct stu /*定义结构体定义结构体*/int num;char*name;char s
25、ex;float score;boy5=101,Li ping,M,45,102,Zhang ping,M,62.5,103,He fang,F,92.5,104,Cheng ling,F,87,105,Wang ming,M,58;/*对结构体数组元素初始化对结构体数组元素初始化*/void main()int i,c=0;float ave,s=0;for(i=0;i5;i+)s+=boyi.score;if(boyi.score60)c+=1;printf(s=%6.2fn,s);ave=s/5;/*计算平均成绩计算平均成绩*/printf(average=%6.2fncount=%dn
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用
限制150内