《C语言程序设计》-第9章 结构体与联合体_第1页
《C语言程序设计》-第9章 结构体与联合体_第2页
《C语言程序设计》-第9章 结构体与联合体_第3页
《C语言程序设计》-第9章 结构体与联合体_第4页
《C语言程序设计》-第9章 结构体与联合体_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

9.1结构体定义9.1.1结构体定义格式1.完整的结构体定义格式struct结构体名{

成员说明1;成员说明2;

……}结构体变量表;说明:(1)“struct”是关键字。(2)“结构体名”是合法的标识符,用来标识该类型的结构体。返回下一页9.1结构体定义(3)“成员说明”是对每个数据项的类型说明,每个数据项在结构体中称为“成员”或“域”,其类型可以是任何已知的数据类型。(4)“结构体变量表”是说明该类型的变量名表。2.仅定义结构体类型struct结构体名{

成员说明1;成员说明2;

……};它是第一种格式的简化——省略了“结构体变量表”,但它后面的分号“;”不能省。上一页下一页返回9.1结构体定义3.无名结构体Struct{

成员说明1;成员说明2;

……}结构体变量表;它也是第一种格式的简化——省略了“结构体名”,但“结构体变量表”不能同时省略,我们称这种结构体为“无名结构体”。上一页下一页返回9.1结构体定义9.1.2结构体变量1.结构体变量的内存分配若说明:

structSTUDENTs;则系统将为结构体变量s分配相应的内存空间,图9.1所示的分配情况可以看出,分配的顺序是按成员的定义顺序分配的,结构体变量所占内存的总字节数是各个成员所占字节数之和。2.结构体变量的引用一般格式:结构体变量名.成员名说明:(1)结构体变量的成员是什么类型,则对该成员的操作与相同类型上一页下一页返回9.1结构体定义的普通变量并无区别,但需要在成员名前缀以结构体变量名。(2)结构体变量不能整体的输入或输出,只能对各个成员分别进行。(3)同一类型的结构体变量可以赋值。3.结构体变量的初始化和其他类型变量一样,对结构体变量可以在定义时指定初始值。上一页返回9.2结构体数组数组元素的类型可以是简单类型,也可以是结构体类型。在上节中我们定义了一个学生结构体STUDENT,如果想存储一个班的学生数据,显然应该使用数组。返回9.3结构体与指针一个结构体变量占据一块连续的内存单元,这块内存单元的起始地址可由一个结构体类型的指针来指向,从而实现使用指针来访问结构体变量中的各个成员。9.3.1结构体指针1.结构体指针的说明形式

struct结构体名*结构体指针变量名;2.通过结构体指针对结构体变量的成员实现访问,有两种形式格式一:(*结构体变量名).成员名格式二:结构体变量名成员名返回9.4结构体与函数9.4.1参数为结构体类型1.普通结构体类型作函数参数同结构体变量可以作函数参数。当函数被调用时,将参数结构体变量的所有成员逐个的复制到形参结构体变量相应的成员中。2.结构体数组作为函数参数当结构体数组作函数参数时,实参数组与形参数组应是类型相同的结构体。它们之间的配合,任然采用“换名操作”的方式。3.结构体指针作函数参数当函数参数为结构体指针时,要求实参是同类型的结构体变量的地址。当函数被调用时,使形参指针指向该地址。下一页返回9.4结构体与函数9.4.2函数的返回值为结构体类型1.返回值为结构体类型函数的类型可以为简单类型,也可以是结构体类型,可以将函数的值赋给同类型的结构体变量。2。返回值为结构体指针函数可以返回一个结构体变量的地址,该地址可以用一个同类型结构体指针来指向。上一页返回9.5动态内存管理9.5.1常用动态内存管理函数1.分配动态内存函数malloc()其函数原型为:

void*malloc(unsignedintsize);其作用是在内存的动态存储区中分配一个长度为size的连续空间,并返回指向该内存的首地址。如果无足够内存,该函数将返回空指针(NULL)。2.释放已分配的动态内存函数free()其函数原型为:

voidfree(void*p);其作用是释放由p指向的动态内存空间,使该内存成为自由内存。注:p指向的动态内存一定是由动态内存分配函数所分配的内存。下一页返回9.5动态内存管理9.5.2链表1.链表的概念链表是指一种常见的重要的数据结构,它是动态的进行存储分配的一种结构,它可以根据需要开辟内存单元。当要解决的问题数据量不确定时,虽然可以使用动态数组,但数组在进行插入。删除时需要移动大量数据,在很多场合有它的局限性。而链表就可以有效的解决这类问题。如图9.3表示的是最简单的一种链表,即单链表。其中,head是指向链表开头结点的一个指针变量,称为“头指针”。头指针后面的每一个元素称为“结点”,每个节点包括两部分:①用来存放数据的部分,称“数据域”;②用来存储下一个结点地址的部分,由指针实现,称“指针域”。链表中最后一个结点的指针域的值为NULL。上一页下一页返回9.5动态内存管理2.对链表的常规操作(1)结点的动态分配(2)遍历整个链表(3)在p所指向的结点后面插入一个新结点q图9.4是当开辟的新结点q的数据(d)为90时,将其插入到p结点之后的链表指针变化情况。(4)将p所指向结点的后继结点删除,并使q指针指向被删除的节点。图9.5是当p结点的下一个结点删除之后的情况。上一页返回9.6联合体联合体与结构体类似,它也可以把许多不同类型的数据组织在一起。我们知道,结构体在给成员分配内存空间时,是一个成员接一个成员的顺序分配内存,不同成员占有不同的内存空间。与结构体不同,联合体却是将这些成员从同一个内存地址分配,这样就使比较靠前的内存单元为所有成员所共享,所以也有人将联合体称为“共用体”。联合体的定义的完整形式:

union联合体名

{

成员说明1;成员说明2;

……}联合体变量表;返回9.7枚举类型由于联合体的特殊性,为联合体变量所分配的内存是所有成员中占内存最大的成员所需空间的大小。如果一个变量只有几种确定的值,可以定义枚举类型,然后将该变量说明为枚举类型的变量。枚举类型的定义一般形式:

enum枚举名{枚举常量表}枚举类型变量名表;说明:(1)“枚举类型变量名表”可以省略。(2)枚举常量应该是合法的标识符。(3)枚举变量只能取枚举的那些元素。(4)枚举元素是常量,而不是变量。下一页返回9.7枚举类型(5)枚举常量的值是该枚举常量在“枚举常量表”中的序号,可以输出。(6)枚举变量的值不能由scanf读入(7)枚举量可以比较、自增、自减运算。(8)一个整数不能直接赋值给一个枚举变量,而需要强制的类型转换。(9)枚举类型的使用,主要为了提高程序的可读性。但由于输入、输出受到限制,通常都要编写转换过程,这样会使程序变长。上一页返回9.8用typedef定义新类型名对于结构体、联合体、枚举等类型名都比较长,书写起来不方便。如果能像系统提供的那些标准类型名一样,使用起来就比较方便了。C语言实现的手段就是用typedef来声明一个新的类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论