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