第11章结构体与共用体.

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第11章结构体与共用体11.1概述11.2定义结构体类型变量的方法11.3结构体变量的引用11.4结构体变量的初始化11.5结构体数组11.6指向结构体类型数据的指针11.7用指针处理链表11.8共用体11.9枚举类型11.10用typedef定义类型(1)掌握结构体和共用体类型的说明、结构体和共用体变量的定义及初始化方法(2)掌握结构体与共用体成员的引用(3)领会动态存储分配和释放(4)掌握链表的基本概念和基本操作(5)领会枚举类型变量的定义(6)了解typedef的作用大纲要求11.1概述记录--由多种数据组成,如成绩册中每个学生的数据是一个记录,可以包括:学号、姓名及各科成绩又如学生基本情况表中可以包括每个学生的:学号、姓名、性别、年龄、成绩、地址等。C中实现记录的方法:使用结构体类型structstudent{intnum;charname[20],sex;intage;floatscore;charaddr[30];};结构类型定义struct结构体名/*struct是结构类型关键字*/{数据类型数据项1;数据类型数据项2;…………数据类型数据项n;};/*此行分号不能少!*/例:定义一个反映学生基本情况的结构类型,用以存储学生的相关信息。结构体类型定义格式structdate/*用于存放日期型数据*、{intyear;intmonth;intday;};structstd_info/*学生信息结构类型:由学号、姓{charno[7];名、性别和生日共4项组成*/charname[9];charsex[3];structdatebirthday;};structscore/*成绩结构类型:由学号和三门成绩共{charno[7];4项组成*/intscore1;intscore2;intscore3;};structstudent{longnum;charnname[20];charsex;intage;floatscore;charaddr[30];};(1)“结构类型名”和“数据项”的命名规则,与变量名相同。(2)数据类型相同的数据项,既可逐个、逐行分别定义,也可合并成一行定义。例如,本例代码中的日期结构类型,也可改为如下形式:structdate{intyear,month,day;};(3)结构类型中的数据项,既可以是基本数据类型,也允许是另一个已经定义的结构类型。例如,本例代码中的结构类型std_info,其数据项“birthday”就是一个已经定义的日期结构类型date。(4)本书将1个数据项称为结构类型的1个成员(或分量)。用户自己定义的结构类型,与系统定义的标准类型(int、char等)一样,可用来定义结构变量的类型。定义结构变量的方法,可概括为3种:1.间接定义法──先声明结构类型、再定义结构变量一般格式为:struct结构体名结构体变量名表;例如,利用例1中定义的学生信息结构类型std_info,定义了一个相应的结构变量student1:structstd_infostudent1;结构变量student1:拥有结构类型的全部成员,其中birthday成员是一个日期结构类型,它又由3个成员构成。结构体变量所占的存储空间为其各成员所占存储空间之和。注意:使用间接定义法定义结构变量时,必须同时指定结构体名。11.2定义结构体类型变量的方法2.直接定义法──在定义结构类型的同时,定义结构变量例structstudent{intnum;charname[20];charsex;intage;floatscore;charaddr[30];}student1,student2;同时定义结构类型及其结构变量的一般格式如下:struct结构体名{成员表列}结构变量名表;3.直接定义结构体类型变量其一般格式如下:struct{成员表列;}结构变量表;structstudent{intnum;charname[20];charsex;intage;floatscore;structdatebirthday;charaddr[30];}student1,student2;说明(1)结构类型与结构变量是两个不同的概念,其区别如同int类型与int型变量的区别一样。编译时类型不占存储空间。(2)结构类型中的成员名,可以与程序中的变量同名,它们代表不同的对象,互不干扰。(3)成员可以是基本类型或构造类型(数组,结构体类型,共用体类型)、指针类型。11.3结构体变量的引用结构体变量的引用规则:1,对于结构变量,要通过成员运算符“.”,逐个访问其成员,且访问的格式为:结构变量.成员/*其中的“.”是成员运算符*/不能将一个结构体变量作为一个整体进行输入输出及其它运算2,如果成员本身是一个结构体或共用体,则要用若干成员运算符,直到找到最低一级的成员为止。如在前面的例中对日期的引用为:student1.birthday.year,student1.birthday.month,student1.birthday.day3,对结构体变量成员可以像普通变量一样进行各种操作。4,可以引用结构体变量成员的地址。11.4结构变量的初始化结构变量初始化的格式,与一维数组相似:结构变量={初值表}不同的是:如果某成员本身又是结构类型,则该成员的初值为一个初值表。例11.1对结构体变量初始化#includestdio.hvoidmain(){structstudent{longintnum;charname[20];charsex;charaddr[30];}a={89031,LiLin,'M',123BeijingRoad};printf(NO:%ld\nname:%s\nsex:%c\naddress:%s\n,a.num,a.name,a.sex,a.addr);}注意:初值的数据类型,应与结构变量中相应成员所要求的一致,否则会出错。11.5结构体数组11.5.1定义结构体数组结构数组的每一个元素,都是结构类型数据,均包含结构类型的所有成员。与结构变量的定义相似,结构数组的定义也分直接定义和间接定义两种方法,只需说明为数组即可。structstudent{intnum;charnname[20];charsex;intage;floatscore;charaddr[30];}stu[3];structstudentstu1[10];11.5.2结构体数组的初始化与普通数组一样,结构数组也可在定义时进行初始化。初始化的格式为:结构数组[n]={{初值表1},{初值表2},...,{初值表n}}11.5.3结构体数组应用举例例11.2对候选人得票的统计程序。设有3个候选人,每次输入一个得票候选人的名字,要求最后输出各得票结果。#includestring#includestdio.hstructperson{charname[20];intcount;}leader[3]={Li,0,Zhang,0,Fun,0};voidmain(){inti,j;charleader_name[20];for(i=0;i10;i++){scanf(%s,leader_name);for(j=0;j3;j++)if(strcmp(leader_name,leader[j].name)==0)leader[j].count++;}for(i=0;i3;i++)printf(\n%5s:%d,leader[i].name,leader[i].count);}11.6指向结构体类型数据的指针结构变量在内存中的起始地址称为结构变量的指针。通过指向结构变量的指针来访问结构变量的成员,与直接使用结构变量的效果一样。一般地说,如果指针变量p已指向结构变量stu_1,则以下三种形式等价:(1)stu_1.成员(2)(*p).成员/*“*p”外面的括号不能省!*/(3)p-成员注意:在格式(1)中,分量运算符左侧的运算对象,只能是结构变量,;而在格式(2)中,指向运算符左侧的运算对象,只能是指向结构变量(或结构数组)的指针变量,否则都出错例11.3指向结构体变量的指针的应用#includestring.h#includestdio.hvoidmain(){structstudent{longnum;charname[20];charsex;floatscore;}stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(p-name,LiLin);(*p).sex='M';stu_1.score=89.5;printf(NO:%ld\nname:%s\nsex:%c\nscore:%f\n,stu_1.num,stu_1.name,stu_1.sex,stu_1.score);printf(NO:%ld\nname:%s\nsex:%c\nscore:%f\n,(*p).num,(*p).name,(*p).sex,(*p).score);}11.6.2指向结构体数组的指针如果指针变量p已指向某结构数组,则p+1指向结构数组的下一个元素,而不是当前元素的下一个成员。另外,如果指针变量p已经指向一个结构变量(或结构数组),就不能再使之指向结构变量(或结构数组元素)的某一成员。例11.4指向结构体数组的指针的应用#includestdio.hstructstudent{intnum,age;charname[20],sex;};structstudentstu[3]={{10101,LiLin,'M',18},{10102,ZhangFun,'M',19},{10104,WangMin,'F',20}};voidmain(){structstudent*p;printf(No.NameSexage\n);for(p=stu;pstu+3;p++)printf(%5d%-20s%2c%4d\n,p-num,p-name,p-sex,p-age);}11.6.3用结构体变量主指向结构体的指针作函数参数例11.5有一个结构体变量stu,内含学生学号、姓名和3门课程成绩,要求在main函数中赋矛值,在另一函数print中将它们输出要完成的工作:建立结构体定义结构体变量给结构体变量赋值调用函数输出定义print函数#includestdio.h#includestring.hstructstudent{intnum;charname[20];floatscore[3];};voidmain(){voidprint(structstudent);structstudentstu;stu.num=12345;strcpy(stu.name,LiLi);stu.score[0]=67.5;stu.score[1]=89;stu.score[2]=78.6;print(stu);}voidprint(structstudentstu){printf(%d\n%s\n%f\n%f\n%f\n,stu.num,stu.name,stu.score[0],stu.score[1],stu.score[2]);}例11.6使用指向结构体变量的指针作为函数参数#includestdio.h#includestring.hstructstudent{intnum;charname[20];floatscore[3];}stu={12345,LiLi,67.5,89,78.6};voidmain(){voidprint(structstudent*);print(&stu);}voidprint(structstudent*p){printf(%d\n%s\n%f\n%f\n%f\n,p-num,p-name,p-score[0],p-score[1],p-score[2]);}11.7用指针处理链表11.7.1链表概述1.链表结构链表作为一种常用的、能够实现动态存储分配的数据结构,图11.10所示为单链

1 / 57
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功