结构类型与联合类型.ppt





《结构类型与联合类型.ppt》由会员分享,可在线阅读,更多相关《结构类型与联合类型.ppt(104页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C语言程序设计(第3版)中国铁道出版社China Railway Publishing House普通高等教育普通高等教育“十一五十一五”国家级规划教国家级规划教材材主主 教教 材:材:C C C C语言程序设计(第三版)语言程序设计(第三版)语言程序设计(第三版)语言程序设计(第三版)书书 号号:ISBN 978-7-113-09512-3 ISBN 978-7-113-09512-3 ISBN 978-7-113-09512-3 ISBN 978-7-113-09512-3 中国铁道出版社中国铁道出版社中国铁道出版社中国铁道出版社 2009 2009 2009 2009年年年年2 2 2
2、2月月月月 第第第第3 3 3 3版版版版配套教材:配套教材:C C C C语言程序设计实验教程语言程序设计实验教程语言程序设计实验教程语言程序设计实验教程书书 号号:ISBN 978-7-113-09513-0ISBN 978-7-113-09513-0ISBN 978-7-113-09513-0ISBN 978-7-113-09513-0 中国铁道出版社中国铁道出版社中国铁道出版社中国铁道出版社 2009 2009 2009 2009年年年年2 2 2 2月月月月 第第第第1 1 1 1版版版版作者电子邮箱:作者电子邮箱:作者电子邮箱:作者电子邮箱:LL 第第第第6 6章章章章 结构类型与
3、联合类型结构类型与联合类型结构类型与联合类型结构类型与联合类型6.1 结构类型与联合类型概述6.3 动态链表6.2 结构类型6.4 联合类型6.5 位域类型6.6 枚举类型结束放映结束放映结束放映结束放映6.1 结构类型与联合类型概述结构类型与联合类型概述结构数据结构数据结构数据结构数据结构能直观地表示客观世界中的许多事物,是由多个不同类型的成员组装而成的复杂数据形态。这些不同类型的成员信息可以表示为基本类型的数据,也可能仍然是复杂的数据,无法直接表示为基本类型的数据,需要通过不断的数据精化,直到可以用基本类型的数据来表达为止。结构类型的每个数据成员都需要不同的名称,为避免同结构类型的结构数据
4、的成员名称冲突,C语言要求表示成员数据项时需要给出结构数据名,结构名与成员数据项名称间以英文园点(.)分隔。例如:例如:学生类型的数据组成如下表所示用结构类型描述上述数据结构如下:用结构类型描述上述数据结构如下:用结构类型描述上述数据结构如下:用结构类型描述上述数据结构如下:typedef struct No no;Name name;Sex sex;Grade grade4;Student;4个成员数据项,分别使用了非基本的数据类型,定义类型如下:typedef char No5;typedef char Name10;typedef char Sex;typedef int Grade;结
5、构数据的内存分配结构数据的内存分配定义一个结构类型的变量,实际上是为结构变量中的每个成员数据项分配内存空间。结构类型的变量所需分配的内存空间大小是结构类型的所有成员变量所需分配空间大小之和,可以使用运算符sizeof(结构变量名)或sizeof(结构类型名)来计算结构类型变量所需分配的空间大小。结构数据的内存分配结构数据的内存分配例如:例如:学生类型的一个变量需要分配的内存大小可以通过sizeof(Student)来计算,sizeof也可以计算其它类型的内存大小,这样学生类型的变量也可以通过sizeof(No)+sizeof(Name)+sizeof(Sex)+sizeof(Grade)*4
6、来计算。联合类型联合类型联合类型联合类型联合类型的定义格式与结构类型相似,但其成员变量的内存分配方式不同。联合类型的变量分配时按最大的成员变量所需内存大小来分配,所有成员变量从同一个内存地址共享内存,因此,通过取址操作&得到的成员变量的地址均相同。下图可帮助读者理解不同成员共享内存的方法:例如例如例如例如:要进行学生情况调查,大学生的调查项目为专业,而中学生的调查项目为身高,其它项目均相同,这时可以使用联合方式来实现。调查表格式如下:C语言可利用联合类型表格式中的共项栏目:专业/身高项目,定义方法如下:typedef struct Name name;.Major_Height mh;Surv
7、ey;typedef char Major10;typedef int Height;typedef union Major major;Height height;Major_Height;结构类型的定义结构类型的定义结构类型的定义结构类型的定义定义结构数据需要先定义结构类型,结构类型分为命名和匿名两种。定义结构类型的格式定义结构类型的格式定义结构类型的格式定义结构类型的格式struct 结构类型名成员定义表 结构变量名表;6.2 结构类型结构类型说明:说明:说明:说明:每个成员变量的定义与一般的变量定义一样,不能后跟初始值并以分号结束,成员变量可以是基本类型也可以构造类型,所有成员变量根据
8、定义的先后顺序分配内存。结构变量名表给出了多个标识符,以逗号分隔,每个标识符说明了一个结构变量,命名的结构类型可以省略结构变量名表,表示先只定义类型以后再使用。使用结构类型定义结构变量的格式使用结构类型定义结构变量的格式使用结构类型定义结构变量的格式使用结构类型定义结构变量的格式struct 结构类型名 结构变量名表;说明:说明:说明:说明:结构类型名是已定义的命名结构类型的名称 例如:例如:例如:例如:struct student char no6;char name10;char sex;int grade4;a=02001,Tom,M,90,85,95,80;struct student
9、 b=02002,Jane,M,80,75,95,60;使用使用使用使用typedeftypedef命令可以命名一个结构类型,这命令可以命名一个结构类型,这命令可以命名一个结构类型,这命令可以命名一个结构类型,这种类型名不需要带上保留字种类型名不需要带上保留字种类型名不需要带上保留字种类型名不需要带上保留字structstruct就可以使用。就可以使用。就可以使用。就可以使用。格式如下:格式如下:格式如下:格式如下:typedef struct 成员定义表 结构类型名;说明:说明:说明:说明:与前面的结构类型定义方式不同,该命令只能定义结构类型不能同时定义结构变量,遵循先定义结构类型再定义结构
10、变量的顺序。例如:例如:例如:例如:typedef char No6;typedef char Name10;typedef char Sex;typedef int Grade;typedef struct No no;Name name;Sex sex;Grade grade4;Student;Student a=02001,Tom,M,90,85,95,80,b=02002,Jane,M,80,75,95,60;匿名结构类型匿名结构类型匿名结构类型匿名结构类型结构类型匿名可以建立结构类型,只是该结构类型建立后只能用一次。如果使用匿名的结构类型定义了变量,再次用同样的结构定义了另一个变量,
11、这时,两次定义会构建两种不同的结构类型,即使这两个变量结构上完全相同,但类型却仍是不一样的。例如:例如:例如:例如:struct char no6;char name10;a;struct char no6;char name10;b;结构类型的基本操作结构类型的基本操作结构类型的基本操作结构类型的基本操作1.1.使用结构变量中的成员使用结构变量中的成员使用结构变量中的成员使用结构变量中的成员结构变量中的成员变量的引用名格式:结构变量中的成员变量的引用名格式:结构变量中的成员变量的引用名格式:结构变量中的成员变量的引用名格式:结构变量名.成员变量名说明:说明:说明:说明:结构变量名是已定义的标
12、识符,其类型中必须包含该成员变量名。成员变量名依然可以是构造类型,由于成员运算符.优先级最高,使用时该引用名不用括号界定,直接像普通的变量名一样使用。该引用名可以使用结构变量内存空间中的一个数据域空间。例如:例如:例如:例如:Student a;int i;for(i=1;i=4;i+)printf(“%d”,a.gradei);【例【例【例【例6.16.1】编写程序完成结构变量的编写程序完成结构变量的输入输出(一)输入输出(一)#include#include typedef struct int typedef struct int month,day,year;Date;month,da
13、y,year;Date;typedef struct typedef struct char no6;char no6;char name10;char name10;Date birthday;Date birthday;Student;Student;Student stud;Student stud;/*/*全局变量全局变量*/*/void main()void main()char ch;char ch;do do printf(Function Menun);printf(Function Menun);printf(=n);printf(=n);printf(1.Input Dat
14、an);printf(1.Input Datan);printf(2.Output Datan);printf(2.Output Datan);printf(0.Exitn);printf(0.Exitn);ch=getch();ch=getch();switch(ch)switch(ch)case 1:readdata();break;case 1:readdata();break;/*/*输入数据到结构变量输入数据到结构变量输入数据到结构变量输入数据到结构变量stud*/stud*/case 2:writedata();break;case 2:writedata();break;/*/*
15、显示结构变量显示结构变量显示结构变量显示结构变量studstud中数据中数据中数据中数据*/*/while(ch!=0);while(ch!=0);【例【例【例【例6.16.1】编写程序完成结构变量的输入输出(二)编写程序完成结构变量的输入输出(二)void readdata()void readdata()int y,m,d;int y,m,d;printf(Please input student detail:n);printf(Please input student detail:n);printf(=);printf(=);printf(Student NO:);scanf(%s,
16、stud.no);printf(Student NO:);scanf(%s,stud.no);printf(Student Name:);scanf(%s,stud.name);printf(Student Name:);scanf(%s,stud.name);printf(Birthday(Year,Month,Day):);printf(Birthday(Year,Month,Day):);scanf(%d,%d,%d,&y,&m,&d);scanf(%d,%d,%d,&y,&m,&d);=y;=y;=m;=m;=d;=d;printf(OK!);printf(OK!);【例【例【例【例6
17、.16.1】编写程序完成结构变量的输入输出(三)编写程序完成结构变量的输入输出(三)void writedata()void writedata()int y,m,d;int y,m,d;printf(Student detail:n);printf(Student detail:n);printf(=);printf(=);printf(Student NO:%sn,stud.no);printf(Student NO:%sn,stud.no);printf(Student Name:%sn,stud.name);printf(Student Name:%sn,stud.name);y=;y
18、=;m=;m=;d=;d=;printf(Birthday:%d-%d-%dn,y,m,d);printf(Birthday:%d-%d-%dn,y,m,d);printf(=n);printf(=n);结构类型的基本操作结构类型的基本操作结构类型的基本操作结构类型的基本操作2.2.使用结构变量的整体使用结构变量的整体使用结构变量的整体使用结构变量的整体结构变量不仅可以提取成员变量使用,还可以作为一个整体来使用,作为整体使用的操作有:赋值、取址。结构变量的赋值结构变量的赋值结构变量的赋值结构变量的赋值仅限于两个结构变量之间进行。从内部机制来看,结构变量的赋值是按顺序复制结构变量的分配的内存空间
19、中的每个字节,全部字节的内容复制完成则两个结构变量复制完成,从外部直观来看,赋值是针对变量中的每个成员变量进行的,如果成员变量是基本类型则直接赋值,如果成员变量是构造类型则为分情况考虑:数组类型的成员变量会依次赋值每个数组元素;指针类型的成员变量只赋值变量中的指针值,不会赋值间接访问到的单元;结构类型的成员变量则进入结构中赋值成员变量的每个成员。结构类型的基本操作结构类型的基本操作结构类型的基本操作结构类型的基本操作 结构变量的取址结构变量的取址结构变量的取址结构变量的取址与普通变量的取址含义一样,取出该变量在内存中的开始地址作为结果,结构变量的地址称为结构指针,结构指针可以进行指针运算,也可
20、以间接访问结构单元,还可以间接访问结构单元中的成员变量。【例【例【例【例6.26.2】结构变量的整体操作(一)】结构变量的整体操作(一)】结构变量的整体操作(一)】结构变量的整体操作(一)#include#include struct student1 struct student1 char no6;char no6;char name10;char name10;int grade3;int grade3;struct student2 struct student2 char*no;char*no;char*name;char*name;struct struct int year;in
21、t year;int month;int month;int day;int day;birthday;birthday;【例【例【例【例6.26.2】结构变量的整体操作(二)】结构变量的整体操作(二)】结构变量的整体操作(二)】结构变量的整体操作(二)void main()void main()struct student1 a=02001,tom,70,80,60,b;struct student1 a=02001,tom,70,80,60,b;struct student2 c=02002,john,1988,7,12,d;struct student2 c=02002,john,198
22、8,7,12,d;printf(No:%snName:%sn,a.no,a.name);printf(No:%snName:%sn,a.no,a.name);printf(Grades:%d%d%dn,a.grade0,a.grade1,a.grade2);printf(Grades:%d%d%dn,a.grade0,a.grade1,a.grade2);b=a;b=a;printf(No:%snName:%sn,b.no,b.name);printf(No:%snName:%sn,b.no,b.name);printf(Grades:%d%d%dn,b.grade0,b.grade1,b.g
23、rade2);printf(Grades:%d%d%dn,b.grade0,b.grade1,b.grade2);printf(No:%snName:%sn,c.no,c.name);printf(No:%snName:%sn,c.no,c.name);printf(Birthday:%d,);printf(Birthday:%d,);printf(%d%);printf(%d%);d=c;d=c;printf(No:%snName:%sn,d.no,d.name);printf(No:%snName:%sn,d.no,d.name);printf(Birthday:%d,);printf(B
24、irthday:%d,);printf(%d%);printf(%d%);printf(%p,%pn,a.no,b.no);printf(%p,%pn,a.no,b.no);printf(%p,%pn,c.no,d.no);printf(%p,%pn,c.no,d.no);结构参数结构参数结构参数结构参数函数的参数传递涉及到形参和实参,形参是设计函数时提供的一种局部变量,在函数调用时自动生成,调用结束时自动释放,实参是主程序调用函数时提供给函数处理的原始数据值,可以是常数、变量或表达式而且必须与对应位置的形参类型相同。值传递方式函数直接使用形参变量,地址传递方式函数间接使用形参变量,即通过主程
25、序提供的地址实参找到所指向的内存单元来访问。例如,int型实参传递给形参的是实参表达式计算得到的int型值,函数直接使用该形参变量,不会使用到函数之外的内存空间;数组实参使用了数组名,数组名代表了数组第一元素的地址,作为实参传递给函数中的形参变量,函数间接使用形参变量找到数组空间并访问。【例6.3】结构数据的比较相等。(一)#include#include#include typedef struct int year;int month;int day;Birthday;typedef struct char*no;char*name;Birthday birthday;Student;【例
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 结构 类型 联合

限制150内