版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10.1结构体数据
10.1.1结构体数据类型的定义结构体数据类型的定义形式:struct结构体名{
成员列表};下一页返回10.1结构体数据
例如,上述学生信息数据的描述可以定义结构体数据类型为structstudent
/∗结构体名∗/{
charnum[10];
/∗以下定义成员项的类型和名字∗/charname[20];intage;charsex;floatscore;};在这个结构体数据类型定义中,struct是C语言关键字,student是结构体名,该结构体由5个成员组成。第1个成员为num,字符串变量;第2个成员为name,字符串变量;第3个成员为age,整型变量;第4个成员为sex,字符变量;第5个成员为score,实型变量。上一页下一页返回10.1结构体数据
需要注意的是,在大括号内的分号是不可少的。另外,还应注意student不是变量名,它与struct一起构成一种新类型名,可以像使用int、char等类型名一样,使用这种新类型名来声明结构体类型变量,凡声明为结构体student的变量都由上述5个成员组成。由此可见,结构是一种复杂的数据类型,是数目固定、类型不同的若干有序变量的集合,因此在学习过程中应注意结构体类型和基本数据类型以及数组类型的不同。上一页下一页返回10.1结构体数据
10.1.2结构体变量的定义10.1.1节指定了一个结构体类型。它相当于一个模型,但其中并无具体数据,系统对其也不分配实际的内存单元,只有用这种新类型来声明变量时,才为该类型变量分配相应的内存。为了能在程序中使用结构体类型的数据,应当定义结构体类型的变量,并在其中存放具体的数据。可以采取以下3种方法定义结构体类型变量。上一页下一页返回10.1结构体数据
1.先定义结构体类型再声明结构体类型变量例如:structstudent{
charnum[10];charname[20];intage;charsex;floatscore;};structstudentstu1,stu2;定义了stu1和stu2为structstudent类型的变量,即它们具有structstudent类型的结构。上一页下一页返回10.1结构体数据
2.在定义结构体类型的同时声明结构体类型变量例如:structstudent{
charnum[10];charname[20];intage;charsex;floatscore;}stu1,stu2;它的作用与第一种方法相同,即定义了两个structstudent类型的变量stu1和stu2。上一页下一页返回10.1结构体数据
3.直接声明结构体类型变量例如:struct{
charnum[10];charname[20];intage;charsex;floatscore;}stu1,stu2;第三种方法与第二种方法的区别在于,第三种方法省去了结构名,直接给出结构变量。三种方法中声明的stu1、stu2变量都具有图10.1所示的结构。上一页下一页返回10.1结构体数据
这说明变量stu1、stu2为student类型后,即可向这两个变量中的各个成员赋值。在上述结构体定义中,所有成员都是基本数据类型或数组类型。【注意】(1)类型与变量是不同概念,不要混淆。(2)结构体中的成员,可以单独使用,其作用与地位相当于普通变量。(3)成员也可以是一个结构体变量。(4)成员名可以与程序中的变量名相同,二者不代表同一对象。上一页下一页返回10.1结构体数据
10.1.3结构体变量的引用变量的引用就是对变量的各种操作。对结构体变量的引用,实际上就是对其最终成员的引用。引用结构体变量中成员的方法:结构体变量名.成员名例如,stu1.age表示stu1变量中的age成员,可以对结构体变量的成员赋值。如:stu1.age=19;stu2.score=82.5;其中,“.”是成员运算符,把stu1.age作为一个整体来看待。该赋值语句的作用是将整数19赋给stu1变量中的成员age,将实数82.5赋给stu2变量中的成员score。上一页下一页返回10.1结构体数据
【注意】(1)不能将一个结构体变量作为一个整体进行赋值和输出;只能对其各个成员分别输出。(2)对成员变量可以像普通变量一样进行各种运算。例如:sumage=stu1.age+stu2.age;(3)既可以引用成员的地址,也可以引用结构体变量的地址。例如:printf("score=%f",stu2.score);(4)若成员本身还属于一个结构体类型,则只能对最低级的成员进行赋值或存取以及运算。例如:stu3.birthday.year=1998;stu3.birthday.month=10;stu3.birthday.day=19;上一页下一页返回10.1结构体数据
10.1.4结构体变量的初始化和其他类型变量一样,对结构体变量可以在定义时指定初始值。上一页下一页返回10.1结构体数据
【例10-1】结构体初始化的程序举例。上一页下一页返回10.1结构体数据
上一页下一页返回10.1结构体数据
10.1.5结构体数组数组的元素也可以是结构体类型的,因此可以构成结构体数组。结构体数组的每一个元素都是具有相同结构体类型的下标结构体变量。在实际应用中,常用结构体数组来表示具有相同数据结构的群体,如一个班的学生档案、一个车间职工的工资表等。上一页下一页返回10.1结构体数据
1.结构体数组的定义定义结构体数组的方法与定义结构体变量的方法类似,也可以有三种方法,只要在每一种方法的基础上,增加对数组维数的说明即可。例如:structstudent{
charnum[10];charname[20];intage;charsex;floatscore;};structstudentstud[4];上面定义了一个数组stud,其元素为structstudent类型数据,数组有4个元素。上一页下一页返回10.1结构体数据
也可以直接定义一个结构体数组,例如:structstudent{
︙}stud[4];或struct{︙}stud[4];上一页下一页返回10.1结构体数据
2.结构体数组的初始化对结构体数组可以作初始化赋值。结构体数组的一个元素相当于一个结构体变量,结构体数组初始化即顺序对数组元素初始化。例如:structstudent{
charnum[10];charname[20];intage;charsex;floatscore;}stud[4]={{"09306102","LiSi",17,'M',83.5},{…},{…},{…}};当对全部元素作初始化赋值时,也可不给出数组长度。上一页下一页返回10.1结构体数据
3.结构体数组应用举例【例10-2】统计候选人选票的统计程序。设有3个候选人,每次输入1个得票候选人的名字,要求最后输入各候选人得票的结果。上一页下一页返回10.1结构体数据
上一页下一页返回10.1结构体数据
运行结果:程序说明:程序定义一个全局的结构体数组leader,它有3个元素,每一个元素包含两个成员name(姓名)和count(票数)。在定义数组时,使之初始化,即将3位候选人的票数都置0。在主函数中定义字符数组leader_name,它代表被选人的姓名。在10次循环中,每次先输入一个被选人的具体人名,然后把它与3个候选人姓名相比,看它和哪一位候选人的名字相同。在输入和统计结束之后,将3人的名字和得票数输出。上一页下一页返回10.1结构体数据
10.1.6结构体指针一个指针变量当用来指向一个结构体变量时,称之为结构体指针变量。结构体指针变量中的值是所指向的结构体变量的首地址。通过结构体指针即可访问该结构体变量,这与数组指针和函数指针的情况是相同的。上一页下一页返回10.1结构体数据
1.结构体指针结构指针变量声明的一般形式如下:struct结构体名∗结构体指针名;例如,用前面已定义的结构体声明一个结构体指针如下:structstudent{
charnum[10];charname[20];intage;charsex;floatscore;}∗stud;上一页下一页返回10.1结构体数据
也可省略结构体指针名,只作结构体说明。例如:structstudent∗stud;使用结构体指针对结构体成员的访问,与结构体变量对结构体成员的访问在表达方式上有所不同。结构体指针对结构体成员的访问表示为结构体指针名->成员名或(∗结构体指针名).成员名其中,“->”是符号“-”和“>”的组合,好像一个箭头指向结构体成员。例如,要给上面定义的结构体中的成员name和age赋值,可以用下面语句:strcpy(stud->name,"ZhangSan");stud->age=19;实际上,stud->name就是(∗stud).name的缩写形式。要注意的是,(∗stud)中的两侧括号不能省略,因为成员运算符“.”优先于“∗”运算符。上一页下一页返回10.1结构体数据
结构体指针是指向结构体的一个指针,即结构体中第一个成员的首地址,因此在使用之前应该对结构体指针初始化,即分配整个结构体长度的字节空间,这可用下面的函数完成:stud=(structstudent∗)malloc(sizeof(structstudent));sizeof(structstudent)自动求取student结构体的字节长度,malloc()函数定义了一个大小为结构体长度的内存区域,然后将其首地址作为结构体指针返回给结构体指针stud。上一页下一页返回10.1结构体数据
【注意】(1)结构体是一种数据类型,因此声明的结构体变量或结构体指针变量同样有局部变量和全局变量,视定义的位置而定。(2)结构体变量名不是指向该结构体的地址,这与数组名的含义不同。因此,若需要求结构体中第一个成员的首地址,应该是“&结构体变量名”。(3)结构体的复杂形式:嵌套结构体。即结构体中的成员变量可以是一个已定义的结构体。上一页下一页返回10.1结构体数据
【例10-3】结构体指针在程序中的使用。上一页下一页返回10.1结构体数据
上一页下一页返回10.1结构体数据
2.结构体指针作为函数的参数结构体变量具有C语言中变量的全部特性,在函数调用方面也不例外。结构体变量、结构体指针变量以及结构体数组等均可作为函数的参数(形参或实参)。与其他数据类型的运用一样,结构体类型的形参和实参也需相互匹配。上一页下一页返回10.1结构体数据
【例10-4】结构体指针作为函数的形参及实参。上一页下一页返回10.1结构体数据
上一页下一页返回10.1结构体数据
运行结果:上一页返回10.2结构体指针的应用———链表
众所周知,数组在内存中占用连续的存储单元。即数组被定义时,由系统分配,且在程序运行期间保持不变。因此,类似数组这样的数据结构被称为静态数据结构。数组的优点是可以随机地访问每一个数组元素,而缺点则体现在以下3方面:(1)在做元素的插入和删除运算时,需要移动大量元素而可能降低效率。(2)由于数组的大小固定且需要一块连续的存储空间,对数据量变化较大的情况,必须按最大需要进行分配,这样有可能浪费很多内存。(3)在程序运行期间,无法根据需要对数组进行扩充,也不可能释放其中的某一部分内存。事实上,存在大量的问题需要使用动态方式的数据结构。所谓动态数据结构,是指数据结构占用的空间可以动态地变化,即可以根据需要随机地分配和释放内存空间。在逻辑上连续的数据元素,在内存上却不一定连续,如图10.2所示。下一页返回10.2结构体指针的应用———链表
动态数据结构中的最基本形式有单向链表和二叉树,它们在程序设计中有着广泛的应用,本节将简单介绍单向链表的定义和使用。C语言中,由动态存储分配函数和结构体类型支持实现动态数据结构。上一页下一页返回10.2结构体指针的应用———链表
1.动态内存分配函数常用的内存管理函数有以下三个:1)分配内存空间函数malloc调用形式:(类型说明符∗)malloc(size)功能:在内存的动态存储区中分配一块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。其中,类型说明符表示把该区域用于何种数据类型;(类型说明符∗)表示把返回值强制转换为该类型指针;size是一个无符号数。例如:pc=(char∗)malloc(100);表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc。上一页下一页返回10.2结构体指针的应用———链表
2)分配内存空间函数calloc调用形式:(类型说明符∗)calloc(n,size)功能:在内存空间存储区中分配n块长度为“size”字节的连续区域。函数的返回值为该区域的首地址。(类型说明符∗)用于强制类型转换。calloc函数与malloc函数的区别仅在于一次可以分配n块区域。例如:ps=(structstu∗)calloc(2,sizeof(structstu));其中,sizeof(structstu)用于求stu的结构长度。因此该语句的意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。上一页下一页返回10.2结构体指针的应用———链表
3)释放内存空间函数free调用形式:free(void∗ptr);功能:释放ptr所指向的一块内存空间,ptr是一个任意类型的指针变量,它指向被释放区域的首地址。被释放区应是由malloc或calloc函数所分配的区域。上一页下一页返回10.2结构体指针的应用———链表
2.单向链表链表是一组节点的序列,所有节点具有相同的数据类型,每一个节点由若干个数据项组成。这些项目主要包括数据域和指针域两类。其中的指针域使该节点能和其他节点相连,从而形成链表。一个节点中的指针域可以有多个(数据域亦然),最简单的情况是只有一个指针域,并用来存储下一个节点的地址,这就是单向链表。一个单向链表的基本形式如图10.3所示。通常,整个链表有一个头指针,它指向链表的第一个节点(称之为头节点)。最后一个节点的指针应设置为空,以表明它不指向任何节点。对于链表的主要操作有:建立链表、遍历链表(对每个节点进行某种操作)、插入节点、删除节点和查找节点等。上一页下一页返回10.2结构体指针的应用———链表
3.实现链表的数据结构在C语言中,链表中的每一个节点恰好对应一个结构体变量,它的一般定义形式如下:struct结构体名{
类型1成员1;类型2成员2;︙类型n成员n;struct结构体名∗指针名;};上一页下一页返回10.2结构体指针的应用———链表
例如,假定链表节点中的数据部分只有一个整型成员,可定义如下类型:structnode{
intdata;structnode∗next;};上一页下一页返回10.2结构体指针的应用———链表
【例10-5】假定一个带头节点∗h的单链表的节点结构如下:typedefstructnode{
chardata;structnode∗next;}NodeType;编写一个函数,删除data成员等于x的所有节点。解:从头开始扫描单链表,pre始终指向当前节点∗p的前一个节点,当p所指节点满足条件时,使用语句pre->next=p->next删除p所指节点。上一页下一页返回10.2结构体指针的应用———链表
上一页下一页返回10.2结构体指针的应用———链表
上一页返回10.3共用体数据类型
10.3.1共用体的概念所谓共用体数据类型,是指将不同的数据项组织成一个整体,它们在内存中占用同一段存储单元。共用体数据类型的定义与结构体数据类型的定义相似,但所用的关键字不同,共用体数据类型用关键字union定义,具体形式如下:union共用体名{成员列表};下一页返回10.3共用体数据类型
例如:uniondata{
inti;charch;floatf;}obj;该形式定义了一个共用体数据类型uniondata,定义了共用体数据类型变量obj。共用体数据类型与结构体在形式上非常相似,但其表示的含义及存储是完全不同的,如图10.4所示。从图中可以看出:(1)结构体数据类型变量所占内存长度是各成员占内存长度之和。(2)共用体数据类型变量所占内存长度等于最长的成员的长度,其所有成员均起始于同一地址,它们是相互重叠(或覆盖)的。上一页下一页返回10.3共用体数据类型
10.3.2共用体的引用同结构体数据类型一样,共用体数据类型的引用也是通过成员运算符“.”来进行的。【例10-6】共用体变量的引用。上一页下一页返回10.3共用体数据类型
上一页下一页返回10.3共用体数据类型
共用体类型数据具有以下特点:(1)同一个内存段可以用来存放几种不同类型的成员,但在每一瞬时只能存放其中一种。(2)共用体变量中起作用的成员是最后一次存放的成员,在存入一个新的成员后,原有的成员就失去作用。(3)共用体变量的地址和它的各成员的地址都是同一地址。(4)不能对共用体变量名赋值,也不能企图引用变量名来得到一个值,还不能在定义共用体变量时对它初始化。例如,下面定义的代码是错误的:union{
inti;charch;}x={6,'A'}上一页下一页返回10.3共用体数据类型
(5)不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。(6)共用体类型可以出现在结构体类型定义中,也可以定义共用体数组。上一页返回10.4枚举类型
在实际问题中,有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有7天;一年只有4个季节;等等。如果把这些变量说明为整型、字符型或者其他类型显然是不妥当的。因此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型。例如,表示星期的Sun、Mon、Tue、Wed、Thu、Fri、Sat,就是一个枚举。声明枚举类型用enum开头。例如:enumweekday{Sun,Mon,Tue,Wed,Thu,Fri,Sat};下一页返回10.4枚举类型
如果枚举没有被初始化,则从第一个标识符开始,顺次赋给标识符0、1、2…当定义改成enumweekday{
Sun,Mon=2,Tue=5,Wed,Thu,Fri,Sat}test;则Sun=0,Mon=2,Tue=5,Wed=6,Thu=7,…上一页下一页返回10.4枚举类型
【例10-7】枚举数据类型应用。上一页下一页返回10.4枚举类型
上一页下一页返回10.4枚举类型
运行结果:上一页返回10.5类型重定义typedef
C语言不仅提供了丰富的数据类型,还允许由用户自己定义类型说明符,即允许由用户为数据类型取“别名”。类型定义符typedef即可用来完成此功能。例如,有整型变量a、b,其说明为inta,b;其中,int是整型变量的类型说明符。int的完整写法为integer,为了增加程序的可读性,可把整型说明符用typedef定义为typedefintINTEGER然后,就可用INTEGER来代替int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理专业知识:皮肤护理与维护
- 网络设备维护管理承诺书(6篇)
- 护理带教中的多学科管理能力
- 媒体行业内容管理系统搭建方案
- 护理职业形象与公众认知
- 企业沟通协作平台及会议系统
- 护理知识要点解析回顾
- 跨区域项目管理综合计划模板
- 个人社交行为信守承诺书(8篇)
- 企业信息安全与守秘责任承诺书专业版(7篇)
- 2026年及未来5年中国UPS电池行业市场全景监测及投资战略咨询报告
- 2026年通信安全员ABC证考试题库及答案
- 2026年药品经营质量管理规范培训试题及答案
- (2026春)部编版八年级语文下册全册教案(新版本)
- 2026年伊犁职业技术学院单招职业技能测试题库及答案详解(考点梳理)
- 中建施工升降机安拆专项施工投标方案技术标-含检查表(2025年)
- csco非小细胞肺癌诊疗指南(2025版)
- 部编版六年级下册道德与法治全册教案教学设计
- 《建设项目全过程造价咨询规程》
- 模块3 城市轨道交通车站安全管理
- (完整版)高英第2课课文
评论
0/150
提交评论