




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
结构体与共用体结构体类型与结构体变量7.1结构体数组7.2结构体与函数7.3动态数据结构7.4共用体7.57.1结构体类型与结构体变量
在学生登记表中每个学生都有相同的信息如学生姓名、学号、年龄、性别、所在班级、各科成绩等,如果将这些数据类型不同的信息单独定义成相互独立的变量分开处理则很难反映出它们之间的内在联系。在程序中如何将这些信息组织在一起,使得对它们的访问和操作同步呢?7.1.1结构体类型的定义结构体类型定义的语法形式如下:struct结构体标识符{成员变量列表;…};其中struct为系统关键字(keyword),说明当前定义一个新的结构体类型。结构体标识符遵循C语言标识符命名规则。在{}之间通过分号分割的变量列表称为成员变量(structuremember),用于描述此类事物的某一方面特性。成员变量可以为基本数据类型(如float)、数组和指针类型,也可以为结构体。由于不同的成员变量分别描述事物某一方面的特性,因此成员变量不能重名。例如,为了描述班级(假设仅仅包括班级编号、专业、人数等信息),可以定义如下的结构体,structClass{charcode[10];/*编号*/charmajor[30];/*专业*/unsignedintcount;/*人数*/};7.1.1结构体类型的定义7.1.2结构体变量的定义与初始化定义结构体类型变量有如下三种方法。1.定义结构体类型后定义变量在上面定义了一个结构体类型structstudent之后,可以用它定义变量,以便存储一个具体的学生,例如:structstudentstud;以上定义了stud是structstudent结构体类型的变量,student是结构体名,不能省略。2.定义结构体类型同时定义变量在定义结构体类型的同时,定义结构体类型变量。此方法的语法形式如下:struct结构体标识符{成员变量列表;…}变量1,变量2…,变量n;其中变量1,变量2…,变量n为变量列表,遵循变量的定义规则,彼此之间通过逗号分割。提示:在实际的应用中,定义结构体同时定义结构体变量适合于定义局部使用的结构体类型或结构体类型变量,例如在一个文件内部或函数内部。7.1.2结构体变量的定义与初始化3.直接定义变量此种方法在定义结构体的同时定义结构体类型的变量,但是不给出结构体标识符。此方法的语法形式如下:struct{成员变量列表;…}变量1,变量2…,变量n;其实质是定义具有如下:struct{成员变量列表;…}类型的匿名结构体之后,再定义相应的变量。由于此结构体没有标识符,所以无法采用定义结构体变量的第一种方法来定义变量。提示:在实际的应用中,此方法适合于临时定义局部变量或结构体成员变量。7.1.2结构体变量的定义与初始化关于结构体类型,有几点要特别说明:(1)类型和变量是不同的概念,如以上定义的structstudent是结构体类型名,它与int、char等一样是类型名。编译时,对类型不分配内存空间,只对变量分配内存空间。7.1.2结构体变量的定义与初始化(2)成员也可以是其它结构体类型的变量例如:structdate{intmonth;intday;intyear;
};structstudent{longnumber;charname[10];charsex;structdatebirthday;/*出生日期*/intscore[3];}stud1,stud2;首先说明了structdate类型,包含3个成员:month(月)、day(日)、year(年份)。然后在说明structstudent类型时,将成员birthday定义成structdate类型。7.1.2结构体变量的定义与初始化(3)结构体中的成员可以和程序中的变量同名,但二者不表示同一对象。例如程序中可以定义一个变量name,它与structstudent中name成员是不同的,互不干扰。7.1.2结构体变量的定义与初始化4.结构体变量的初始化具体的形式如下:struct结构体标识符{成员变量列表;…};Struct结构体标识符变量名={初始化值1,初始化值2,…,初始化值n};7.1.2结构体变量的定义与初始化7.1.3结构体变量的引用1.对结构体变量中成员的引用结构体成员的引用形式如下:结构体变量名.成员名“.”是成员运算符,它在所有运算符中优先级别最高。所以在程序中任何地方“结构体变量名.成员名”出现都是一个整体。【例7.1】
结构体变量成员的引用示例。2.对整个结构体变量的引用(1)相同类型的结构体变量可以相互赋值例如:structstudentstud1,stud2;stud1=stud2就是合法的赋值表达式,它可以将结构类型变量stud2的全部内容赋给另一个结构类型变量stud1,而不必逐个成员地多次赋值。7.1.3结构体变量的引用(2)结构体变量可以取地址例如:structstudentstud;&stud是合法的表达式,结果是结构体变量stud的地址。7.1.3结构体变量的引用(3)不能将一个结构体变量作为一个整体进行输入输出例如:struct{intx;inty;}a;a.x=4;a.y=5;以下引用是错误的:printf(“%d,%d\n”,a);只能对结构体变量的各个成员分别进行输入输出。对结构体成员的操作和同类型变量的操作相同。【例7.2】输入3个同学的姓名、数学成绩、英语成绩和物理成绩,确定总分最高的同学,并打印其姓名及其三门课程的成绩。7.1.3结构体变量的引用7.1.4指向结构体变量的指针1.结构体指针变量的定义结构体指针变量的一般形式定义如下:形式1:
struct结构体标识符{成员变量列表;…};struct结构体标识符*指针变量名;形式2:struct结构体标识符{成员变量列表;…}*指针变量名;形式3:struct{成员变量列表;…}*指针变量名;其中“指针变量名”为结构体指针变量的名称。形式1是先定义结构体,然后再定义此类型的结构体指针变量;形式2和形式3是在定义结构体的同时定义此类型的结构体指针变量。7.1.3结构体变量的引用2.结构体指针变量的初始化结构体指针变量在使用前必须进行初始化,其初始化的方式与基本数据类型指针变量的初始化相同,在定义的同时赋予其一结构体变量的地址。例如structPointoPoint={0,0,0};structPointpPoints=&oPoint;/*定义的同时初始化*/在实际应用过程中,可以不对其进行初始化,但是在使用前必须通过赋值表达式赋予其有效的地址值。例如:structPointoPoint={0,0,0};structPoint*pPoints2;pPoints2=&oPoint;/*通过赋值表达式*/7.1.3结构体变量的引用3.通过结构体的指针引用结构体的成员通过结构体的指针引用结构体的成员有两种方法:一种通过间接访问算符“*”;另一种通过成员选择运算符。(1)使用间接访问算符“*”引用结构体成员基本引用形式是:(*结构体的指针)·成员名7.1.3结构体变量的引用(2)使用成员选择运算符“->”C语言中为了使用方便和直观,用成员选择运算符“->”简化结构体成员的指针引用形式,成员选择运算符又称为箭头操作符(arrowoperator),由减号和大于号拼接而成。使用成员选择运算符引用结构体成员的形式为:结构体的指针->成员名7.1.3结构体变量的引用7.1.5关键字typedef的用法typedef的一般使用形式如下:typedef原类型名新类型名;如:typedefstruct{ intyear; intmonth; intday;}DATE;定义新的类型名DATE,它表示上面指定的结构体类型。在使用typedef时,应当注意如下的问题:(1)typedef的目的是为已知数据类型增加一个新的名称。因此并没有引入新的数据类型。(2)typedef只适于类型名称定义,不适合变量的定义。(3)typedef与#define具有相似的之处,但是实质不同。7.1.5关键字typedef的用法7.2结构体数组结构体数组是以同类型的结构体变量为数组元素的数组。通常一个结构体变量可以存放一个整体的数据(如一个学生的数据),而需要存放多个整体的数据(如多个学生的数据),则应当采用结构体数组,这是最常见的用法之一。7.2.1结构体数组的定义方式1:struct结构体标识符{成员变量列表;…};struct结构体标识符数组名[数组长度];方式2:struct结构体标识符{成员变量列表;…}数组名[数组长度];7.2.1结构体数组的定义方式3:struct{成员变量列表;…}数组名[数组长度];7.2.1结构体数组的定义对于数组的引用,分为数组元素和数组本身的引用。对于数组元素的引用,其实质为简单变量的引用。对于数组本身的引用实质是数组首地址的引用。7.2.1结构体数组的定义1.数组元素的引用数组元素引用的语法形式如下:数组名[数组下标];[]为下标运算符;数组下标的取值范围为(0,1,2,...,n-1),n为数组长度。7.2.1结构体数组的定义2.数组的引用数组作为一个整体的引用,一般表现在如下两个方面:(1)作为一块连续存储单元的起始地址与结构体指针变量配合使用;(2)作为函数参数。7.2.1结构体数组的定义7.2.2结构体数组的初始化结构体数组的初始化遵循基本数据类型数组的初始化规律,在定义数组的同时,对其中的每一个元素进行初始化。例如:structstudent{longnumber;charname[20];charsex;intage;floatheight;}s[3]={{10101,“zhangsan”,’M’,19,177},{10104,“liming”,’F’,20,164.5},{10106,“wangwu”’M’,18,175.5}};7.2.1结构体数组的定义7.2.3结构体数组的应用【例7.5】计算学生的平均成绩和不及格的人数。【例7.6】
编程输入5个学生的姓名和数学、英语、语文三门课的成绩,计算每个学生的平均成绩,并输出学生姓名和平均成绩。分析:程序中定义一个结构体数组s,它有5个数组元素,用于存放5个学生数据。每个数组元素是structstudent结构体类型变量,包含5个成员:name(姓名)、math(数学成绩)、eng(英语成绩)、cuit(语文成绩)、aver(平均成绩)。7.3结构体与函数在C语言中,与前面介绍的其他类型数据一样,结构体也可作为函数的参数,有以下三种形式:1.结构体变量的成员作函数的参数。与普通变量作函数参数一样,是将实参(结构体变量的成员变量)的值向形参进行单向传递。2.结构体变量作函数的参数。结构体变量作函数的参数是将实参(结构体变量的所有成员)的值逐个传递给同结构类型形参,因此这种方式也是属于值的单向传递。3.用指向结构体变量(或数组)的指针作函数的参数。在这种情况下,是将结构体变量(或数组)的首地址传递给形参,此时形参和实参有相同的内存空间,形参值的改变等价于对应实参值的改变,因此它属于双向传递。7.3结构体与函数【例7.7】结构体变量作为函数参数,计算职工的实发工资。【例7.8】结构体指针作为函数参数,设置学生成绩等级并统计不及格人数。7.4动态数据结构如何充分利用内存空间是计算机软件设计中一个非常重要的课题,解决上述问题的关键之一是链表技术及其相关算法的引入。链表是一种常见的重要的数据结构。例如,要建立一个通讯录,每个通讯记录包括联系人姓名、住址、邮编、电话等数据项。可以考虑使用数组存放数据,但是数组必须预先定义它的固定的长度,如50个联系人。但是一个通信录中的联系人数目很难事先确定,而且人数可能随时会变化。为了能够存储所有联系人数据,必须把数组的大小定义得足够大。显然这样会浪费内存空间。因此采用链表就可以解决这些问题。利用结构体变量可以构成链表这种数据结构。单链表采用一组不连续的存储单元存放链表中的数据元素,链表中的每个元素称为结点,而链表的每个结点在存储器中的位置可以是随意的,为了明确链表中的第一个结点的位置,需要一个指针指向链表的表头即第一个数据元素,这个指针称为头指针。每个结点都包含两个部分:一是数据域,用于存储数据元素;另一个是指针域,用于存放指针,该指针指向下一个结点。链表的最后一个结点不再指向任何其它结点,因此称为“链尾”,也称尾结点,它的指针域为NULL值,表示链表到此结束。有时为了操作方便,将链表的第一个结点的数据域中不存放任何有意义的数据或者存放链表的一个特殊标志,即使链表中没有任何数据元素存在时一个空链表,该结点也始终存在,该结点被称为头结点。一个结点的下一个结点,称为该结点的后继结点,而前面的一个结点称为该结点的前趋结点。7.4动态数据结构链表的基本操作对链表的主要操作有以下几种:建立链表:是指从无到有地建立起一个链表,即一个一个地输入各节点数据,并建立起前后相链接的关系。结点的查找与输出:从链表的首节点开始,依次查找节点或将节点的数据显示输出,直至链表结尾。插入一个结点:首先根据新节点的数据找到要插入的位置,然后将新节点与右相邻的节点链接起来,最后将新节点与左相邻的节点链接起来。删除一个结点:首先根据要删除节点的数据找到要删除节点的位置,然后将左相邻节点与右相邻的节点链接起来,释放被删除节点所占的内存。7.4动态数据结构【例7.9】建立一个三个结点的链表,存放学生数据。为简单起见,我们假定学生数据结构中只有学号和年龄两项。编写一个建立链表的函数和一个打印链表的函数,建立链表并输出节点数据。7.4动态数据结构7.5共用体所有的成员变量占用同一段内存空间。7.5.1共用体类型的定义和引用共用体类型定义的一般形式为:union共用体类型名{
成员表列
};其中,union是关键字,是共用体类型的标志,共用体类型名是用户定义的标识符,共用体类型和结构体类型一样由若干成员组成。例如:uniondata{inti;floatx;};表示定义了一个共用体类型uniondata,它由i和x两个成员组成。7.5.1共用体类型的定义和引用共用体类型变量的定义和结构体类型变量的的定义类似,也由三种定义的方法:1.先定义共用体类型,再定义共用体类型的变量例如:uniondata{inti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 玻璃风管施工方案
- 钢结构隔层施工方案
- 二零二五年度医疗纠纷责任免除合同免责任协议书
- 二零二五年度茶山茶叶种植与茶叶销售渠道租赁合同
- 二零二五年度综合性医院护士岗位招聘与服务协议
- 二零二五年度新能源开发佣金支付及可持续发展合同
- 二零二五年度橱柜行业产业园区开发合同
- 二零二五年度父债子继债权转让及清偿协议书
- 二零二五年度制造业人员派遣劳动合同
- 2025年度解除国际贸易担保合同
- 室内设计-中式古典风格课件
- 轨道铺设施工专项方案
- MOC3061驱动BT134双向可控硅
- 七下地理《俄罗斯》PPT课件
- 员工劳动合同(易才签订要求)
- 无线通信与网络复习资料
- 八大员考试试题——劳务员题库
- 第七章 住院患者营养风险筛查与评价
- 人教版小学数学五年级下册教材分析
- 省十一届人大三次会议秘书处工作总结
- 致爱丽丝钢琴曲五线谱
评论
0/150
提交评论