第9章结构体共用体.ppt
《第9章结构体共用体.ppt》由会员分享,可在线阅读,更多相关《第9章结构体共用体.ppt(70页珍藏版)》请在三一办公上搜索。
1、,第9章结构体与共用体,C语言程序设计,C语言程序设计,结构体和共用体,第九章,9.1 结构体的说明和定义 9.2 结构体成员的引用与结构体变量的初始化 9.3 结构体数组 9.4 结构体指针 9.5 结构体在函数间的传递 9.6 结构体型和结构体指针型函数 9.7 共用体简介 9.8 枚举类型 9.9 用typedef定义类型,第9章 结构体和共用体,9.1.1 结构体的概念 9.1.2 结构体的说明 9.1.3 结构体变量的定义,9.1 结构体的说明和定义,9.1 结构体的说明和定义,在程序的设计中,会遇见一些关系密切、具有内在联系而且数据类型不同的数据。例如,一个班、一个年级或全校学生的
2、学籍卡包括:他们的学号、姓名、性别、年龄、学习成绩、地址.等。这些数据有的是数字、有的是字符,其数据类型不同,对于这样一类数据可以用结构体来处理。,9.1.1 结构体的概念,结构体是不同数据类型的数据的集合。结构体是构造类型的数据。,一个结构体由若干成员组成。它是组成结构体的要素。每个成员的数据类型可以不同,也可以相同。每个成员有自己的名字。对结构体数据的操作是通过对结构体成员的引用实现的。,结构体的应用为处理复杂的数据结构体提供了有利的手段。特别是对处理那些数据结构比较复杂的程序提供了方便。,每一个结构体有一个名字,所有成员都组织在该名字之下。,结构体名,结构体成员名,9.1.1 结构体的概
3、念,9.1.2 结构体的说明,由于结构体是由不同数据类型的数据组成的集合体。它包含若干成员。因此,在使用结构体进行数据处理时,首先应对结构体的组成进行描述。这种描述称为结构体说明。,结构体说明实质上是构造一个结构体。说明的是结构体是由哪些成员组成以及成员的数据类型。,结构体说明的格式:,struct(是保留字)结构体类型标识符。结构体名(称结构体类型名)由标识符组成。大括号中的结构体成员表,称为结构体。结构体成员表包含若干成员。,struct 结构体名 结构体成员表;,成员的表达形式:,数据类型标识符 结构体成员名;,成员的数据类型,例:用结构建立学生的学籍卡(数据体)。,struct stu
4、dent long num;char name20;char sex;int age;float score;char addr30;student1,student2,.;,student1 student2 student30,结构体变量名,结构体成员名,结构体名,结构体类型标识符,有关结构体说明应注意以下几点:,结构体说明描述了结构体的组织形式,在程序编译时并不为它分配存储空间。结构体成员可以是简单变量、数组、指针、结构体或联合体等。所以,结构体可以嵌套使用,即一个结构体变量也可以成为另一个结构体的成员。结构体说明可以在函数内部,也可以在函数外部。若程序规模较大,可把其结构体说明部分作为
5、文件存放起来(该文件是以.h为后缀的“头文件”),这样可借助于“#include”预编辑语句把它复制到任何源文件中,用以定义同类型的其它结构体变量。结构体成员名可以与程序中其它变量同名,系统会自动识别它们,两者不会混淆。,student1,struct date int month;int day;int year;,定义一个struct date结构体,它代表日期包括三个成员,month(月)、day(日)、year(年)。,结构体成员可以是另一结构体变量,struct student long num;char name20;char sex;int age;float score;cha
6、r addr30;struct date birthday;,在定义struct student 结构体时,成员birthday被定义struct date类型。即结构体成员为另一结构体变量。已定义的(结构)类型struct date与其他类型(int、char)一样可以用来定义结构体成员的类型。,例:,成员name、addr是数组类型,9.1.3 结构体变量的定义,结构体变量同其它变量一样也必须先说明、定义,然后才能引用。结构体变量定义要按照结构体说明中的结构体类型,为被定义的结构体变量分配内存单元,而结构体说明不分配内存。,对结构体中数据(结构体成员)的操作是通过结构体变量的引用来实现的。
7、用结构体变量可以对结构体成员进行赋值、存取或运算。,1、结构体变量的作用,2、结构体变量定义的意义,例如:struct student int num;char name20;char sex;int age;float score;char addr30;student1,student2,student3;,(1)在结构体说明的同时定义结构体变量,该例结构体名为student,用它定义了三个结构体变量student1、student2、student3,三个变量具有相同的组成结构体,即相同的类型。,这种定义方法的特点是:定义一次结构体变量之后,在该定义之后的任何位置还可用该结构体类型来定义
8、其它结构体变量。,3、结构体变量定义格式,结构体变量定义的三种形式:,struct 结构体名 结构体成员表;结构体变量名表;,其定义格式为:,例如:struct int num;char name20;char sex;int age;float score;char addr30;student1,student2,student3;,不出现结构体名,这里定义了三个结构体变量与(1)相同。这种定义方法的特点是:,struct 结构体成员表;结构体变量名表;,(2)直接定义结构体变量,其定义形式为:,不出现结构体名,这种定义方法的特点是:不能在别处用来另行定义别的结构体变量,要想定义就必须将s
9、truct 这部分重写。,例如:struct student int num;char name20;char sex;int age;float score;char addr30;.struct student student1,student2,student3;,这种定义方法的特点是:可把其结构体说明部分作为文件存放起来,这样可借助于“#include”预编辑语句把它复制到任何源文件中,用以定义同类型的其它结构体变量。,struct 结构体名 结构体成员表;.存贮类型 struct 结构体名 结构体变量名表;,(3)把定义和说明分开,其定义格式为:,注意结构体声明和结构体变量定义的区别
10、。每个结构体变量表示的是一组(域)成员(数据)。而不是一个数据。每个结构体中所有结构体变量的结构(类型)是一样的。在一个结构体中可以定义多少个结构体成员。结构体变量的定义一定要在结构体说明之后或与结构体说明同时进行。结构体变量一般不用register寄存器型的存储方式。结构体变量中的成员可以单独使用,其作用和地位与一般变量相同。结构体变量占用实际内存的大小可用sizeof()运算来实现。即:sizeof(结构体名)。,结构体变量的定义应注意的几点:,9.2 结构体成员的引用与结构体变量的初始化,9.2.1 结构体成员的引用 9.2.2 结构体变量的初始化,9.2 结构体成员的引用与结构体变量的
11、初始化,结构体成员引用有三种方式:,9.2.1 结构体成员的引用,(2)用指针的方式,(1)用结构体成员运算符方式,定义一个指针结(构体指针),使它指向该结构体变量,这时就可用指针和成员名来引用结构体成员了。,即:结构体变量名.成员名。,(3)用“-”指向运算符引用结构体成员,定义一个指针(结构体指针),使它指向该结构体变量,这时就可用指针和成员名来引用结构体成员了。其格式为:指针名-结构体成员名,例:struct student long num;char name20;char sex;int age;float score;char addr30;stu1,stu2;,结构体成员的引用:
12、,用结构成员运算符“.”引用结构体成员struct student stu1;struct student stu2;stu1.num=2010001;stu1.sex=M;stu1.age=18;stu1.score=87;Strcpy(stu1.addr,“Beijing”);,用结构成员运算符“.”引用结构体成员格式:,“.”结构体成员运算符,结构体成员运算符就表示对结构体成员的引用,结构体变量名.结构体成员,(2)不能将一个结构体变量作为一个整体加以引用。,(3)对结构体成员的操作与其它变量一样,可进行各种运算。,结构体成员引用的几点说明:,例:stu1.num 作为一个整体来看待,并
13、对其操作。*stu1.num“.”优先于“*”,其等效为*(stu1.num)。其含义为访问stu1.num(所指地址中的内容)的目标变量。,赋值运算:stu1.score=stu2.score;算术运算:sum=(stu1.score+stu2.score)/2;自加减运算:stu1.age+;+stu1.age;关系运算:stu1.age=stu2.age;,例:printf(“%d,%s,%c,%d,%f,%s”,stu1);,(1)结构体成员运算符“.”的优先级最高,结合性为左结合(从左至右)。,用结构体成员运算符,9.2.2 结构体变量的初始化,结构体变量初始化的格式:,对结构体变量
14、初始化应注意几点:,(1)只能对存储类型为extern外部型和static静态型结构体变量初始化,不能对存储类型为auto自动型的结构体变量初始化。,(2)初始化数据与数据之间用逗号隔开。,(3)初始化数据的个数要与被赋值的结构体成员的个数相等。,(4)初始化数据的类型要与相应的结构体成员的数据类型一致。,(5)不能直接在结构体成员表中对成员赋初值。,结构体变量的初始化,就是在定义结构体变量的同时,对其成员赋初值。规定,只准许对外部和静态结构体变量进行初始化,不能对自动类型的结构体变量初始化。,struct 结构体名 结构体变量名=初始数据;,例:struct student long num
15、;char name20;char sex;int age;float score;char addr30;struct student stu1=2010001,“Li feng”,M,18,87.0,“Beijing”;,struct student long num=2010001;char name20=“Li feng”;char sex=M;int age=18;float score=87.0;char addr30=“Beijing”;stu1,stu2;,不能直接在结构体成员表中对成员赋初值,例9-1 用scanf函数将结构体变量数据输入,用printf函数将其输出。,mai
16、n()struct student long num;char name20;char sex;float score;char addr30;struct student stu1;scanf(%c,运行程序,M2010001Li feng87Beijingnum:2010001name:Li fengsex:Mscore:87addr:Beijing,例,main()struct date int day;int month;int year;char mon_name10;struct date a=28,7,1997,July;printf(day:%dn,a.day);printf(
17、month:%dn,a.month);printf(year:%dn,a.year);printf(mon_name:%sn,a.mon_name);,运行程序,day:28month:7year:1997mon_name:July,9.3 结构体数组,9.3.1 结构体数组的概念 9.3.2 结构体数组的定义 9.3.3 结构体数组的初始化 9.3.4 结构体数组的应用举例,9.3 结构体数组,stu1 stu2 stu30,struct student int num;char name20;char sex;int age;float score;char addr30;stu1,stu
18、2,stu29;,例如:一个班级学生的学籍卡的数据结构如下,要使用该结构体中每个学生的数据,就要定义30个结构体变量(名),即:stu1,stu2.stu30。这种方法很不方便。由于该例结构体变量名都相同,就是最后的序号不同,这种情况可使用结构体数组。,结构体数组是其数组元素都是具有相同结构体类型的结构体变量。即结构体数组是结构体变量集合的一种数组。结构体数组元素中可存放哪些具有内在联系、相互关联的结构体变量。结构体数组适合处理一组具有相同结构体类型的数据。,9.3.1 结构体数组的概念,stu30;,9.3.2 结构体数组的定义,例如:static struct student stu30;
19、例中定义了30个结构体变量,下标0-29(下标从0开始),结构体变量是 stu0、stu1、stu2、.stu29。,结构体数组也必须先定义或说明,后引用。,结构体数组定义的格式:,存储类型 struct 结构体名 结构体数组名 元素个数,结构体名元素个数,.;,结构体数组定义的说明:在结构体数组定义中,结构体即:“struct 结构体名”是已被说明的结构体类型。先说明后定义。存储类型是结构体数组(即结构体变量)的存储类型。结构体数组与前面介绍的数值型数组不同之处在于每个数组元素都是一个结构体类型的数据,它们分别包含各个成员项(一组数据)。,9.3.3 结构体数组的初始化,结构体数组的初始化,
20、就是在定义结构体数组的同时,对其成员赋初值。,结构体数组的初始化格式为:,存储类型 struct 结构体名 结构体数组名 元素个数=初始化数据;,说明:,结构体即“struct 结构体名”是已被说明的结构体类型。初始化的数据的个数与结构体数组元素的个数相同,数据类型相匹配。为了提高可读性,最好每一个数组元素(结构体变量)的初始数据都用花括号括起来。初始化结构体成员数据之间、数组元素之间用逗号隔开。,存储类型 struct 结构体名 结构体成员表;结构体数组名 元素个数=初始化数据;,或,例:struct student long num;char name20;char sex;int age
21、;float score;char addr30;stu30=2010001,“Li feng”,M,18,87,“Beijing”,2010002,“Wang bing”,M,18,79,“Beijing”,.2010030,“Chen ming”,M,17,80,“Beijing”;,例中给结构体变量stu0、stu1、.Stu29的各个成员赋初值。,struct student int num;char name20;char sex;int age;float score;char addr30;struct student stu30=2010001,“Li feng”,M,18,8
22、7,“Beijing”,2010002,“Wang bing”,M,18,79,“Beijing”,.2010030,“Chen ming”,M,17,80,“Beijing”;,结构体数组的初始化也可用以下的形式:,例9.2下述程序的输出结果是:main()struct copml int x;int y;coum2=1,3,2,7;printf(“%d”,coum0.y/coum0.x*coum1.x);A)0 B)1 C)3 D)6,答案:D,3,1,2,9.4 结构体指针,9.4.1 结构体指针的概念 9.4.2 结构体指针的定义和引用 9.4.3 通过结构体指针引用结构体成员 9.4
23、.4 结构体指针的应用,9.4 结构体指针,结构体指针是指向结构体变量的指针。结构体指针是一个指针变量,用来指向结构体变量;其目标变量是一个结构体变量,其目标是一个结构体变量的(一组)数据,其内容是结构体变量的(首)地址。,结构体指针定义的格式:,9.4.1 结构体指针的概念,9.4.2 结构体指针变量的定义和引用,存储类型 struct 结构体名*结构体指针名;,例如:static struct student*pstu;struct student 是预先说明的结构体。*pstu 结构体指针的存储类型是static。,(1)结构体名必须是已经说明的结构体。,struct student i
24、nt num;char name20;char sex;int age;float score;char addr30;stu1,stu2,.stu30;static struct student*pstu;pstu=,(2)结构体指针变量在使用前必须要进行赋值操作,以把某个结构体变量的地址赋给结构体指针,使它指向该结构体变量。,struct student int num;char name20;char sex;int age;float score;char addr30;stu30;static struct student*pstu;pstu=,结构体数组,结构体指针变量的定义和引用
25、应注意的问题:,(3)结构体指针所指向的结构体变量必须与定义时所规定的结构体类型一致。,struct student1 int num;char name20;char sex;int age;float score;char addr30;stu130;static struct student1*pstu1;pstu1=stu2;,struct student2 int num;char name20;char sex;int age;char addr30;stu230;static struct student2*pstu2;pstu2=stu1;,上例中的两个结构体的结构类型(结构体
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 共用
链接地址:https://www.31ppt.com/p-4965934.html