您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 二级C语言程序设计及同步训练-第九章 结构体与共用体
第9章结构体与共用体9.1结构体numnameSexageaddr060001LiFangF18Wuhan060230LinHongF16Changsha060212WuQiangM18Beijing061122LiJunM17Zhengzhou060536ZhangXiaF17Shanghai上表中某一学生的数据是由学生的学号、姓名、性别、年龄、家庭地址等数据项组成的,这些数据项是一组逻辑上相关的数据,如果将这些数据项分割开来孤立地考虑它们的属性,将导致操作的不便或逻辑错误。在C语言中,将这种由多个不同类型的数据项组合在一起形成的数据类型,称为结构体类型。表9-1学生表9.1.1结构体类型的定义结构体类型定义的一般形式:struct标识符{类型名1成员名1;类型名2成员名2;…类型名n成员名n;};9.1.1结构体类型的定义例1对某一学生数据(由学生的学号、姓名、性别、年龄、家庭地址等数据项组成)的结构体类型定义如下:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};(5)结构体类型定义的嵌套。例2:若某一学生数据包括学号、姓名、性别、出生年月、家庭地址,其中出生年月包括出生的年、月、日三个数据,则对某一学生数据的结构体类型定义如下:②再定义student结构体:structstudent{intnum;charname[20];charsex;structdatebirthday;charaddr[30];};①先定义date结构体:structdate{intyear;intmonth;intday;};9.1.1结构体类型的定义9.1.2结构体变量的定义结构体变量的定义有三种处理方式:(1)先定义结构体类型,再定义结构体变量。例1:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};/*定义结构体类型structstudent*/structstudenta,b;/*定义a、b为结构体类型structstudent的变量*/9.1.2结构体变量的定义(2)在定义结构体类型的同时定义结构体变量。例2:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a,b;9.1.2结构体变量的定义(3)直接定义结构类型变量。例3:struct{intnum;charname[20];charsex;intage;charaddr[30];}a,b;9.1.3结构体变量的引用(1)引用结构体变量的成员。格式:结构体变量名·成员名structdate{intyear;intmonth;intday;};structstudent{intnum;charname[20];charsex;structdatebirthday;charaddr[30];};structstudenta,b;a.name=LiFang;b.birthday.day=12;9.1.3结构体变量的引用对结构体变量中的成员都可以像同类型的普通变量一样进行各种运算。例3:a.num=060001+5;b.birthday.day++;(2)结构体变量作为一个整体引用.结构体变量不可以作为整体进行输入输出,但可以作为函数的参数或返回值而被整体引用,也可以将一个结构体变量作为一个整体赋给另一个具有相同类型的结构体变量。例1:structstudenta,b;…a=b;(3)引用结构体变量的地址或成员的地址structstudenta,b;scanf(%d,&a.num);printf(%x,&a.num);printf(%x,&a);9.1.3结构体变量的引用9.1.4结构体变量的初始化结构体变量的初始化形式有如下两种:(1)struct标识符{类型名1成员名1;类型名2成员名2;…类型名n成员名n;}变量名={数据表};例1:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a={060001,LiFang,'F',18,Wuhan};(2)结构体类型名变量名={数据表};例2:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};structstudenta={060001,LiFang,'F',18,Wuhan};9.1.3结构体变量的引用9.2结构体数组9.2.1结构体数组的定义结构体数组定义的一般形式:结构体类型名数组名[常量表达式];例1:structstudent{intnum;charname[20];charsex;intage;charaddr[30];};/*定义结构体类型structstudent*/structstudenta[5];/*定义a[5]结构体类型structstudent的数组*/9.2.2结构体数组元素的引用格式:结构体数组名[元素下标].结构体成员名例1:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5];a[0].num=060001;a[1].name=LinHong;一个结构体数组元素相当于一个结构体变量,其处理方法与结构体变量的处理方法相同9.2.2结构体数组元素的引用例2:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5];scanf(%d,&a[0].num);gets(a[0].name);scanf(%c,&a[0].sex);scanf(%d,&a[0].age);gets(a[0].addr);a[3]=a[0];printf(%x,&a[0].num);printf(%x,&a[0]);9.2.3结构体数组的初始化结构体数组也可以在定义的同时进行数组元素的初始化。例如:structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5]={{060001,LiFang,'F',18,Wuhan},{060230,LinHong,'F',16,Changsha;},…};9.2.4应用举例例9.1输入如表9-1所示的学生情况登记表,按学号顺序整理输出该表。分析如下:1、定义学生类型及学生数组:2、输入学生信息3、输出学生信息(程序由学生和老师共同完成)structstudent{intnum;charname[20];charsex;intage;charaddr[30];}a[5];9.3结构体指针结构体指针变量:如果用一个指针变量指向一个结构体变量,即存储该结构体变量所占据的内存单元的起始地址,则该指针变量称为结构体指针变量。结构体指针变量也可以用来指向结构体数组中的元素。9.3.1结构体指针变量的定义结构体指针变量的定义形式如下:结构体类型名*指针变量名;例如:structstudent*p,a;p=&a;9.3.2引用指针所指向的结构体变量的成员通过指针变量引用结构体变量的成员有如下两种方式:(1)(*结构体指针).成员名例如:(*p).num(2)结构体指针-成员名例如:p-num9.3.3指向结构体数组的指针对于已定义的结构体数组,若用一个变量来存放该结构体数组在内存中的首地址,则该变量为指向结构体数组的指针变量。例如:structstudent*p,a[5];p=a;例9.2用指向结构体数组的指针处理例9.1(按学号顺序整理输出学生情况登记表。)9.4结构体与函数1.结构体变量作为函数的形参的三种形式:(1)以结构体变量的成员作为参数,传递结构体变量的成员的值。(2)以结构体变量作为参数,直接传递结构体变量的值。在ANSIC标准中允许用结构变量作为函数的参数进行整体传送,即直接将实参结构体变量的各个成员的值逐个传递给形参结构体变量的对应成员。注意,实参与形参必须是相同结构体类型的变量。(3)以结构体指针作为参数,传递结构体变量的地址。通过结构体变量的整体传递可以实现函数参数的传递,但这要将结构体变量的全部成员逐个传送,特别是成员为数组时将会使传送的时间和空间开销很大,严重地降低了程序的效率。因此最好的办法就是使用指针,即用指针变量作函数参数进行传送。这时由实参传递给函数形参的只是地址,从而减少了时间和空间的开销。例9.3利用函数完成结构体变量的输入输出。(阅读书中程序)2.结构体类型作为函数的返回值类型其一般定义形式:结构体类型名函数名(形参表){函数体}例(p168)9.4结构体与函数9.5链表C语言中,变量存储空间的分配分为静态分配和动态分配两种方式。(1)静态分配方式:先在程序的声明部分进行定义,然后在程序编译时分配适当的存储单元。这些存储单元一经分配,在它的生存期内是固定不变的。(2)动态分配方式:在程序执行期间,通过“申请”分配指定的存储空间来存储数据,当有闲置不用的存储空间时,又可以随时将其释放。前面章节中处理的变量都是在程序的声明部分定义的变量,在程序编译时分配存储单元,是静态分配方式。本章下面要介绍的是通过动态分配方式,在程序执行期间,通过“申请”分配的动态的存储单元,以及动态分配的存储单元构成的“链表”结构。9.5.1链表的概念例1:利用C语言在计算机中存储三个学生的计算机成绩,如果有定义inta[3],则其内存单元分配情况如下:…80a[0]75a[1]90a[2]…9.5.1链表的概念例2:用链表存储方式来存储三个同学的计算机成绩。……20022036758090……200220582058head80headNULL7590可直观地表示如下:9.5.2动态分配函数1.malloc函数函数格式:void*malloc(unsignedintsize)函数功能:在内存的动态存储区中分配一个长度为size的存储单元。例1:int*p;long*lp;structstudent*head;p=(int*)malloc(2);/*分配一个整型存储单元(占用2个字节),用p指向该存储单元*/lp=(long*)malloc(sizeof(long));/*分配一个长整型存储单元,用lp指向该存储单元,长整型存储单元所占字节数由函数sizeof(long)求得*/head=(structstudent*)malloc(sizeof(structstudent));/*分配一个structstudent结构体类型的存储单元,用head指向该存储单元*/上述函数sizeof(类型名)求出指定类型的存储单元所占字节数。9.5.2动态分配函数2.calloc函数函数格式:voidcalloc(unsignedintn,unsignedintsize);函数功能:在内存的动态存储区域中分配n个长度为size的连续存储单元。形参n和size均为无符号整数,n是连续存储单元的个数,size是一个存储单元占用的字节数。函数的返回值为分配的连续存储单元的起始地址;如果分配不成功,则返回值为0。例2:int*p;p=(int*)calloc(3,sizeof(int));/*分配3个连续的存储单元,并将其起始地址赋给整型指针变量p*/9.5.2动态分配函数3.free函数函数格式:voidfree(void*ptr);函数功能:释放由指针变量ptr指向的内存区域。其中,ptr是一个指针变量,指向最近一次调用函数malloc或calloc时所分配的存储空间的首地址。通过函数free将已分配的内存区域交还系统,使系统可以重新对其进行分配。例3:int*p;p=(int*)calloc(3,sizeof(int));…free(p);9.5.3链表的基本操作1.链表节点的
本文标题:二级C语言程序设计及同步训练-第九章 结构体与共用体
链接地址:https://www.777doc.com/doc-3261925 .html