第八章 结构体 共用体(人民邮电 管银枝主篇).ppt
《第八章 结构体 共用体(人民邮电 管银枝主篇).ppt》由会员分享,可在线阅读,更多相关《第八章 结构体 共用体(人民邮电 管银枝主篇).ppt(81页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第八章第八章 结构体、共用体结构体、共用体本章内容本章内容8.1 结构体类型结构体类型8.2 结构体变量结构体变量8.3 结构体数组结构体数组8.4 共用体共用体8.5 枚举类型枚举类型 8.6 用typedef定义类型 8.7 本章小结本章小结8.1 结构体类型结构体类型任务提出:学生信息管理系统数据库中,学生的信息包括学号、姓名、性别、出生日期、五门课程的成绩及平均成绩,如何定义一个数据类型。任务分析:在此例中,学生的学号、姓名、性别、出生日期、课程的成绩他们的数据类型并不一致,其中的学号、姓名为字符型数组,性别为单个的字符型数据,成绩为实型数据,而出生日期又包括年月日三项。一个学生的学号
2、、姓名、性别、出生年月日、成绩等项,这些项都与某一学生相联系。如果将它们分别定义成互相独立的简单变量,难以反映它们之间的内在联系。但如果把它们组织成一个组合项,定义为另一种如下表所示的结构体类型的数据:结构体类型的定义如下:struct birthday int year;int month;int day;struct studentchar num7char name20;char sex;struct birthday bir;float score5;float average;;8.1.1结构体定义格式结构体定义格式structstruct 结构体名结构体名结构体名结构体名 数据类型
3、数据类型数据类型数据类型1 1 成员名成员名成员名成员名1;1;数据类型数据类型数据类型数据类型2 2 成员名成员名成员名成员名2;2;.数据类型数据类型数据类型数据类型n n 成员名成员名成员名成员名n;n;如:struct studentchar num7;char name20;char sex;float score;在以上定义中:(1)“结构体名”是用户取的标识符,是结构体类型的标志。如上例中的结构体定义中student就是一个结构体名。(2)大括弧内是结构体中的各个成员,由它们组成一个结构体。如上例中的num、name、sex、score等都是成员名。(3)对每个成员必须作类型说明
4、。数据类型可以是基本数据类型说明符,也可以是用户已经定义过的结构体名,还可以是后面将要介绍的其它数据类型的类型说明符。类型说明的格式是:数据类型名数据类型名 成员名成员名(4)成员名是用户取的标识符,是用来标识所包含的成员名称。成员名的命名规则与变量名相同。成员也称为“域”,每一个成员也称为结构体中的一个域。如在上例中的结构体定义中,定义了一个名为student的结构体,该结构共有4个成员组成。第一个成员为 num,整型变量;第二个成员为name,字符数组;第三个成员为sex,字符变量;第四个成员为score,实型变量。应注意括号外面的分号“;”不能少。(5)结构体定义可以嵌套,即某个结构体成
5、员的数据类型可以说明为另一个已定义过的结构体型。例:例:定义一个结构体类型用来表示学生的基本情况,其中的每个学生的数据包括:学号、姓名、性别、年龄、成绩、家庭地址等。分析:分析:该结构体中,可将学号、姓名、家庭地址定义成字符型数组,性别定义成字符型数据,年龄、成绩定义实型数据。结构体名取为“student”,它包括num、name、sex、age、score、addr等不同类型的数据项。结构体类型定义如下:struct student char num7;char name20;char sex;int age;float score;char addr30;例:例:定义一个结构体类型用来表示
6、一个单位的职工档案,职工档案中包括:职工姓名、性别、年龄、工资等。分析:分析:该结构体中,可将职工档案中的职工姓名定义成字符型数组,性别定义成字符型数据,年龄定义成整型数据,工资定义实型数据。结构体名取为“person”,它包括name、sex、age、wage 等不同类型的数据项。结构体类型定义如下:可定义如下的结构体:struct person char name20;char sex;int age;float wage;8.1.2嵌套的结构体类型定义方法嵌套的结构体类型定义方法例:例:定义一个结构体类型用来表示职工档案,职工档案中除和上例一样包括职工姓名、性别、工资外,职工的出生日期要
7、能体现年月日。分析:分析:假设此结构体类型名person1,其成员有职工姓名name、性别sex、出生日期bir、工资wage等五个成员。其中的职工姓名、性别、工资等成员的定义方法同上例一样。而对于出生日期bir又包括三个部分year、month、day(分别对应年、月、日),则要用嵌套的结构体类型定义方法来定义。嵌套的结构体类型定义如下:struct birthday int year;int month;int day;struct person1 char name20;char sex;struct birthday bir;float wage;这里,在定义结构体类型person1时
8、用到了基本数据类型外的结构体类型birthday,此时结构体类型birthday的定义必须出现在前面,否则就会出现“结构体未定义”的错误。8.1.3结构体类型使用说明结构体类型使用说明1.当用户需要将一些不同类型但又相互联系的数据放在一起时,就可以将它们定义成结构体类型,以便于反映它们之间的相互联系。2.结构体定义中的花括号里面的每一个定义语句后面均要用分号“;”作为语句结束标记,花括号外也有一个分号“;”作为结构体定义语句的结束标记。3.结构体是一种数据类型,其中的成员不是变量,系统也不会给成员分配内存。4.已经定义的某种结构体可以作为一种数据类型,用来定义变量、数组、指针等。这时才会给定义
9、的变量、数组、指针分配内存。5.如在定义结构体成员类型时要用到基本数据类型外的结构体类型,即需嵌套定义时,一定要注意引用的结构体类型名必须是已经定义过的,否则就会出现“结构体未定义”的错误。如上面例11.3,名为“birthday”的定义必须在结构体“person1”的定义之前,否则就会出错。8.2 结构体变量结构体变量任务提出:任务提出:学生信息管理系统数据库中,学生信息包括学号、姓名、性别、出生日期、五门课程的成绩、平均成绩等数据,从键盘中输入某学生的数据信息,并输出该学生的所有信息。任务分析:任务分析:前面已定义了一个名为student的结构体,但只是指定了一个结构体类型,它相当于一个模
10、型,其中并没有具体的数据,系统也不给它分配内存单元。为了能在程序中使用结构体类型的数据,还应当定义结构体类型的变量,并在其中存放具体的数据。如果在程序中已经定义了某个结构体,则在此后就可使用这种用户自定义的数据类型来定义变量。上述问题的所需的类型变量的定义如下:struct student stu;#include stdio.h#define MAX2 5struct birthday int year;int month;int day;struct studentchar num7;char name20;char sex;struct birthday bir;int scoreMAX
11、2;float average;main()int i;struct student stu;stu.average=0.0;scanf(%c,&stu.sex);scanf(%d,%d,%d,&stu.bir.year,&stu.bir.month,&stu.bir.day);for(i=0;iMAX2;i+)scanf(%d,&stu.scorei);stu.average+=stu.scorei;scanf(%s%s,stu.num,stu.name);stu.average=stu.average/MAX2;printf(学号:%s,stu.num);printf(n姓名:%s,stu
12、.name);printf(n性别:%c,stu.sex);printf(出生年月日:%d年%d月%d日,stu.bir.year,stu.bir.month,stu.bir.day)printf(n五门课程的成绩为:n);for(i=0;iMAX2;i+)printf(%4d,stu.scorei);printf(n平均成绩为:n);printf(%5.2fn,stu.average);getch();程序运行情况如下:程序运行情况如下:F1991,11,1668 78 88 76 69100001 李平则输出结果为:学号:100001姓名:李平性别:F出生年月日:1991年11月16日五门
13、课程的成绩为:6878887669平均成绩为:75.808.2.1 结构体变量的定义与初始化结构体变量的定义有以下三种方法:1、用结构体类型名定义变量用结构体类型名定义变量用结构体类型名定义变量的一般格式:结构体类型名结构体类型名结构体类型名结构体类型名 变量名变量名变量名变量名1 1,变量名,变量名,变量名,变量名2 2,变量名,变量名,变量名,变量名n n 其中结构体类型名是已经定义过的结构体名,后面的各结构体变量名之间用逗号分隔。这种方法也就是先定义结构体类型再定义变量名。例如:struct student char num7;char name20;char sex;int age;f
14、loat score;char addr30;也可以用宏定义使用一个符号常量来表示一个结构体类型名。例如,在程序的前面有宏定义:#define STU struct student则以上的结构体及变量定义可修改为:struct student char num7;char name20;char sex;int age;float score;char addr30;STU student1,student2;在定义变量的同时,可以对变量赋初值,例如上面的变量定义语句可以改为如下语句:struct student student1=10001,Zhang Xin,M,19,90.5,Shang
15、hai,student2=10002,Wang Li,F,20,98,Beijing;定义结果如下表所示:在定义了结构体变量后,系统会为之分配内存单元。例如student1和student2在内存中各占64个字节(7+20+1+2+4+30=64)。应当注意,将一个变量定义为基本数据类型与将一个变量定义成结构体类型的方法是不同的,后者不仅要求指定结构体类型,而且要求指定为某一特定的结构体类型。2、定义结构体类型的同时定义变量、定义结构体类型的同时定义变量这种定义的一般格式为:struct 结构体名 数据类型1 成员名1;数据类型2 成员名2;.数据类型n 成员名n;变量名表列;例如,为两个学生
16、信息定义2个变量,程序段如下 struct student char num7;char name20;char sex;int age;float score;char addr30;student1,student2;3、定义无名结构体类型的同时定义变量、定义无名结构体类型的同时定义变量这种定义的一般格式为:struct 数据类型1 成员名1;数据类型2 成员名2;.数据类型n 成员名n;变量名表列;例如:struct char num7;char name20;char sex;int age;float score;char addr30;student1,student2;或直接为:
17、struct char num7;char name20;char sex;int age;float score;char addr30;student1=10001,Zhang Xin,M,19,90.5,Shanghai,student2=10001,Wang Li,F,20,98,Beijing;即定义的同时给变量赋初值。这种方法是将类型定义和变量定义同时进行,但是结构体类型的名称省略了,以后将无法使用这种结构体来定义其它的变量。关于结构体类型,有几点说明:(1)类型和变量是两个不同的概念。只能对变量赋初值、存取或运算,而不能对一个类型赋值、存取或运算。对类型不分配内存空间,对变量却要
18、分配内存空间。(2)对结构体中的变量成员(即“域”),可以单独使用,其作用与地位相当于普通变量。(3)成员也可以是一个结构体变量。此时即构成了嵌套的结构。例如:struct dateint momth;int day;int year;struct student char num7;char name20;char sex;int age;struct date birthday;/*birthday是struct date类型*/char addr30;student1,student2;(4)成员名可以与程序中的变量名同,二者不代表同一对象。例如,程序中可以另定义一个变量num,它与st
19、ruct student中的num 是两回事,互不干扰。但初学者应尽量不要这样使用,以防使用不小心时相混。8.2.2 结构体成员的引用结构体成员的引用1、结构体变量成员的引用格式为:结构体变量成员的引用格式为:结构体变量名成员名其中的“”称为成员运算符,其运算的优先级别是最高的,和圆括号“()”、下标运算符“”是同一级别的,运算顺序是自左向右。如:student1.num表示student1中的num(学号)项。由于该成员是一字符型数组类型的,不能用赋值方法给此成员赋值,例如:student1.num10001;是不合法。正确的方法是把“student1.num”看作一个整体,用字符串复制的方
20、法,如:strcpy(student1.num,10001);2、引用结构体变量应遵循的规则、引用结构体变量应遵循的规则(1)不能将一个结构体变量作为一个整体变量进行输入输出,只能对结构体变量中的各个成员分别进行输入输出。例如,前面已定义了student1和student2为结构体变量并且它们也已有了初值。不能这样引用:printf(%s,%s,%c,%d,%f,%sn,student1);(2)如果某个结构体类型的变量成员的数据类型又是一个结构体类型,则只能对最低级的成员进行赋值、输入输出以及运算。外层结构体类型的变量成员是不能单独引用的。这种嵌套的结构体变量成员的引用方法是逐级找到最低级的
21、成员才能使用。例如对具有两层的结构体变量名的引用为:外层结构体类型变量名外层成员名内层成员名如上节已定义过的结构体变量student1,可以这样访问各成员:student1.numstudent1.birthday.month(3)结构体变量的成员可以像普通变量一样进行各种运算(参与运算时注意其类型)。如:student1.score=student2.score+10;sum=student1.score+student2.score;student1.age+;+student2.age;(4)可以引用结构体变量成员的地址,其引用格式为:&结构体变量名成员名例如:scanf(%d,&stu
22、dent1.num);(输入student1.num的值)(5)可以引用结构体变量的地址。结构体变量的地址主要用于作函数的参数,传递结构体的地址。结构体变量的地址的引用格式为:&结构体变量名例如:printf(%x,&student1);(输出student1的首地址)例:例:给结构体变量成员赋值并输出其值。#include main()struct char num7;char name20;char sex;float score3;x=10001,Zhang Xin,M,68,89,78;printf(学号:%sn姓名:%sn性别:%cn,x.num,x.name,x.sex);prin
23、tf(成绩:%.2f、%.2f、%.2f、n,x.score0,x.score1,x.score2);getch();用赋值语句等给结构体变量成员赋值:#include main()/*定义一结构体类型*/*定义一结构体类型的变量*/struct student x;/*给结构体类型的变量x赋值*/strcpy(x.num,100001);strcpy(x.name,Zhang Xin);x.sex=M;x.score0=68;x.score1=89;x.score2=78;/*输出结果*/getch();例:例:嵌套的结构体变量成员的引用举例#include#include struct b
24、irthdayint year;int momth;int day;;struct personchar name20;char sex;struct birthday bir;float wage;x;main()strcpy(x.name,gu);x.sex=F;x.bir.year=1972;x.bir.month=10;x.bir.day=3;x.wage=2880.0;printf(姓名:%s,性别:%c,工资:%fn,x.name,x.sex,x.wage);printf(出生年、月、日%4d%2d%2dn,x.bir.year,x.bir.month,x.bir.day);get
25、ch();8.2.3 结构体与函数结构体与函数 可以将一个结构体变量的值传递给另一个函数,在函数间传递结构体型的数据和传递其它类型数据的方法完全相同,可以使用全局外部变量、返回值、形式参数与实际参数结合方式(参数传递方式又分为值传递和地址传递两种)。将一个结构体变量的值传给另一个函数的具体用法如下:1、使用返回值方式传递结构体数据、使用返回值方式传递结构体数据 函数的返回值必须是某种已定义过的结构体指针(即指向结构体变量的指针),利用“return(表达式);”语句返回的表达式值也必须是同种结构体型的指针,该指针指向的数据则是同一种结构体型的数据;而接受返回值的变量也必须是这种结构体型的指针变
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第八章 结构体 共用体人民邮电 管银枝主篇 第八 结构 共用 人民邮电 管银枝主篇
限制150内