,单击此处编辑母版标题样式,*,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第,10,章 结构体和共用体,在程序设计中,把一些关系密切而数据类型不同的数据组织在一起,并为其命名一个名字,这类数据称为结构体。,共用体是一种类似于结构体的构造型数据类型,它准许不同类型和不同长度的数据共享同一块存储空间。,10.1,结构体类型,10.2,共用体,第10章 结构体和共用体 在程序设计中,把,10.1,结构体类型,结构体,是将若干个类型相同或不同的数据组合成一个有机的集合。,10.1.1,结构体类型定义,使用结构体变量前,要先定义该结构体类型,再定义结构体变量。结构体类型定义的一般格式为:,10.1 结构体类型 结构体,是将,struct,结构体名,类型标识符 成员名列表;,类型标识符 成员名列表;,类型标识符 成员名列表;,;,例如:,struct student,int snum;,char name10;,char sex;,int age;,char addr40;,;,struct 结构体名,10.1.2,结构体变量的定义、引用和初始化,1.,结构体变量定义,定义结构体变量有三种方法。,(1),在定义结构体类型的同时定义结构体变量。,(2),先定义结构体类型,再定义结构体变量。,(3),直接定义结构体变量。,10.1.2 结构体变量的定义、引用和初始化,2.,结构体变量的引用,对结构体变量进行操作时,除了可以对相同类型的结构体变量进行整体赋值外,不可以对一个结构体变量整体赋值。要对一个结构体变量进行操作,其引用的方式为:,结构体变量名,.,成员名,3.,结构体变量的初始化,与数组的初始化类似,结构体变量只能对外部和静态结构体变量初始化。初始化数据之间要用,“,,,”,隔开,不进行初始化的成员项要用,“,,,”,跳过。,2.结构体变量的引用,10.1.3,结构体数组,有序数据的集合称为数组,结构体变量组合在一起称为结构体数组。其定义方式同一般数组一样,例如:,struct student stu10;,这样就定义了一个包含有,10,个元素的结构体数组,其每个数组元素都是一个结构体类型的数据。,10.1.3 结构体数组,10.1.4,结构体的指针,1.,结构体指针的定义及应用,定义结构体的指针,使该指针指向某一类型结构体变量或结构体数组的首地址。如定义一个,struct student,结构类型的指针:,struct student*p1,*p2,stu1,stu10;,要使其指向某一个变量,则必须给它赋值,例如:,p1=,p2=stu;,p1,指向结构体变量,stu1,的首地址,,p2,指向结构体数组,stu,的首地址。,10.1.4 结构体的指针,如需用结构体的指针访问结构成员,可以采用以下方式:,(*,指针名,).,成员名,在,C,语言中,采用,“,-,”,(减号、大于号)运算符来简化调用。例如,要访问指针,p1,指向的结构体变量的成员,可以采用,(*p1).snum,,,(*p1).name,,,(*p1).sex,,,(*p1).age,,,(*p1).addr,也可以采用,p1-snum,,,p1-name,,,p1-sex,,,p1-age,,,p1-addr,。,如需用结构体的指针访问结构成员,可以,2.,用结构体指针作函数参数,可以通过传递结构体变量的成员及传递整个结构体变量或结构体数组的方法来传递数据,还可以通过结构体指针作为函数参数传递数据。,2.用结构体指针作函数参数,10.1.5,利用结构体变量构成链表,链表就是利用递归定义,使得由第一个结构体变量可以找到第二个结构体变量,也就是说如果知道链表的首地址,可以获得整个链表。由于链表的每一个节点的物理位置不是固定的,所以需要以下函数来动态地分配空间及释放空间。,(1)malloc(size),动态申请一个长度为,size,的连续空间,此函数返回一个指针,指向该空间的起始地址,如果错误则返回,0,。,(2)free(ptr),释放,ptr,所指向的内存区。,10.1.5 利用结构体变量构成链表,10.2,共用体,在程序设计中,采用共用体比使用结构体节省空间,但是访问速度慢。,10.2.1,共用体类型说明,公用体类型的说明与结构体类型的说明类似,方法如下:,union,公用体名,类型标识符 成员名列表;,类型标识符 成员名列表;,类型标识符 成员名列表;,;,10.2 共用体 在程序设计中,采用,公用体变量所占内存的长度是成员中最长的长度,在这样一个空间中可以存放不同类型和不同长度的数据,而这些数据都是以同一地址开始存放的。,公用体变量所占内存的长度是成员中最长,例如,定义一个公用体其中包括整型、字符型、实型变量,这三种数据类型的成员共享同一块内存空间。,union unidata,int i;,char ch;,float f;,d1,d2,d3;,这样,d1,、,d2,、,d3,就是一个公用体变量。由于在该结构体类型中实型变量占有内存单元,4,个字节,是最长的成员,所以公用体变量,d1,、,d2,、,d3,都分配,4,个字节的内存单元。,10.2.2,共用体变量的定义、引用,共用体变量的定义同结构体类型变量的定义可以有三种定义方法。其引用也同结构体类型变量的引用,是使用运算符,“,.,”,和,“,-,”,。,在使用共用体变量的时候要注意在程序执行的某一时刻,只有一个共用体成员起作用,而其他的成员不起作用。两个具有相同共用体类型的变量可以互相赋值。可以对共用体变量进行取地址运算。,10.2.2 共用体变量的定义、引用,