第八章-结构体说课材料_第1页
第八章-结构体说课材料_第2页
第八章-结构体说课材料_第3页
第八章-结构体说课材料_第4页
第八章-结构体说课材料_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第八章结构体§8.1

问题的提出学号姓名性别入学时间计算机原理C语言编译原理操作系统1令狐冲男2006908372822林平之男2006789288783岳灵珊女2006897298664任莹莹女2006789587905……6……如果只存储某班的某门课程的成绩,可使用一维数组;只存储若干门课程的成绩,可用二维数组;对于下表该如何组织数据,采用什么存储结构?intstudentId[30]={1,2,3,4,5,6};char studentName[10][30]={{"令狐冲"},{"林平之"},{"岳灵珊"},{"任莹莹"}};char studentSex[2][30]={{"男"},{"男"},{"女"},{"女"}};int timeOfEnter[30]={2006,2006,2006,2006};int scoreComputer[30]={90,78,89,78};int scoreEnglish[30]={83,92,72,95};int scoreMath[30]={72,88,98,87};int scoreMusic[30]={82,78,66,90};采用分散的一维数组结构数据的内存管理方式90788978……83927295……72889887……82786690……1234……令狐冲林平之岳灵珊任莹莹……男男女女……2006200620062006……200040004E00F01010F0EE00CE006600存储学生信息的设想建立一个长度为30的数组,其中的每一个数组元素就是一个学生的学生考试信息,每一个数组元素的理想存储结构可为:学号姓名性别入学原理C编译OS一个完整的变量StudentIdStudentNameStudentSesxTimeOfEnterScore_1Score_2Score_3Score_4§8.2结构体类型与结构体变量格式struct标识符{类型1域名1;类型2域名2;……类型n域名n;};其中:标识符是定义的结构体类型名;结构体名成员、域一、结构体的声明举例定义学生档案的结构体structpersonnel{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};变量说明structpersonnel

person;二、定义结构体的变量struct类型

变量名,……;1、先声明类型后定义变量structpersonnel{int num;char name[10];char sex;int age;float score;char addr[30];};structpersonnel

stu1,stu2;2、在声明同时定义变量structpersonnel{int num;char name[10];char sex;int age;float score;char addr[30];}student1,student2;structpersonnel{int num;char name[10];char sex;int age;float score;char addr[30];};structpersonnel

student1,

student2;等价3、直接定义结构类型变量struct{int num;charname[10];charsex;int age;floatscore;charaddr[30];}student1,student2;如:structdate{intmonth; intday; intyear;};structstudent{int num;char name[10];struct datebirthday;}stu1;4、成员也可以是一个结构体变量numnamebirthdaymonthdayyear5、定义指向结构体的指针变量格式struct结构类型名*指针名;举例structstudent*p,stu1;p=&stu1;指针p即指向结构体变量stu1的首地址。三、结构体变量的引用

格式结构体变量名.域名举例输出学生档案数据printf("%d",person.num);printf("%s",person.name);printf("%c",person.sex);printf("%d",person.age);printf("%f",person.score);printf("%s",person.addr);1、圆点运算符2、箭头运算符域表示结构指针名->域名举例p->num等价于(*p).numstructpersonnel*p,stu1;p=&stu1;结构体变量引用说明⒈不能将一个结构体变量作为一个整体进行输入和输出。下面是错误的:printf("%d,%s,%c,%d,%f,%s\n",student1);而应按成员输入和输出。printf(“%d\n”,student1.num);printf(“%s\n”,);⒉如果成员本身又属一个结构体类型,则要用若干个成员运算符,一级一级地找到最低一级的成员。只能对最低一级的成员进行赋值、存取和运算。structdate

structstudent{intmonth;{intnum;intday;charname[10]intyear;structdatebirthday;

};}student1,student2;例如:student1.numstudent1.birthday.month⒊对结构体变量的成员可以像普通变量一样进行各种运算。⒋可以引用结构体变量成员的地址,也可以引用结构体变量的地址。例如:scanf("%d",&student1.num);printf("%o",&student1);思考题structpoint

{

intx;

inty;

};

structrect

{

structpointpt1;

structpointpt2;

};structrectrt,*rp=&rt;下面表达式哪些合法?rt.pt1.x(*rp).pt1.xrp->pt1.xrt->pt1.x上面合法的表达式都是等价的吗?5、结构体变量的初始化structpersonnel{longintnum;char name[10];char sex;int age;char addr[30];}stu={89031,"lisan",'m',18,"123beijingroad"};§8.3结构体数组

structpersonnel{int num;charname[10];charsex; int age;floatscore;charaddr[30];};1、声明结构体2、定义结构体数组格式structpersonnel{intnum;charname[10];charsex;intage;floatscore;charaddr[30];};structpersonnel

stu[3];numnamesexagescoreaddr10101Lilinm1887.5103beijingroad10102Zhanglif1999130shanghairoad10104Wangbinm2078.526zhongshanroadstu[0]stu[1]stu[2]3、初始化结构体数组structpersonnel

stu[3]={

{10101,"Lilin",'m',18,87.5,"103Beijingroad"}{10102,"Zhangli",'f',19,99,"130Shanghairoad"}{10103,"Wangbin",'m',20,78.5,"26zhongshanroad"}};numnamesexagescoreaddr10101Lilinm1887.5103beijingroad10102Zhanglif1999130shanghairoad10104Wangbinm2078.526zhongshanroad4、结构体数组和指针structpersonnel

stu[30],*p;p=stu;*p

⇔stu[0]

*(p+1)⇔stu[1]*(p+2)⇔stu[2]

*(p+3)⇔stu[3]stu[1].num⇔(*(p+1)).num⇔(p+1)->num5、结构体类型应用举例:(1)已知:structsk{ inta; floatb;}data,*p;若有p=&data;则正确的引用data中成员a的方是:(*p).data.aB.(*p).a

C.p->data.aD.p.data.aB(2)读程序,写出运行结果。main(){struct{ intx;inty;}s[2]={{1,2},{3,4}},*p=s;printf(“%d,%d\n”,++p->x,(++p)->x);}4,3§8.4结构体与函数把结构体传递给函数的方式有三种:1.用结构体的单个成员作参数在一般情况下,用单个成员作为实参给函数传递参数与普通的值传递没有分别,可看成普通的实参,是单向值传递,在函数内部对参数进行操作不影响结构体的变化。main(){structnumber{ intnum1; intnum2;}num;num.num1=5;num.num2=4;f(num.num1,num.num2); . . .}voidf(intm,intn){for(i=1;i<=m;i++)for(j=1;j<=n;j++) printf(“*”);}2、用结构体整体作为实参要求实参和形参的数据类型相同(单向值传递)

举例structdate{intyear;intmonth;intday;};voidfunc(structdatep){p.year=2000;p.month=5;p.day=22;}main(){structdated;d.year=1999;d.month=4;d.day=23;

printf(“%d,%d,%d\n”,d.year,d.month,d.day);

func(d);

printf(“%d,%d,%d\n”,d.year,d.month,d.day);}3、用指向结构体的指针作为实参要求实参和形参指向相同的数据类型。举例structdate{intyear;intmonth;intday;};voidfunc(structdate*p){(*p).year=2000;(*p).month=5;(*p).day=22;}main(){structdatedate1,*d=&date1;d->year=1999;d->month=4;d->day=23;printf("%d,%d,%d\n",(*d).year,(*d).month,(*d).day);func(d);printf("%d,%d,%d\n",d->year,d->month,d->day);}4、Typedef的使用给已定义的数据类型定义别名。功能举例typedef

intinteger;typedef

structstudentstu;说明structstudentstu1,stu2;等价于stustu1,stu2;使用别名时,可不使用struct。§8.5共用体—联合体什么是共用体?是C语言提供的一种存储共享的设施。即将若干个名称不同、类型不同的数据共享同一存储单元。也就是使用覆盖技术,几个长度不同的变量相互覆盖。一、共用体类型的定义格式union共用体名{类型1成员1;类型2成员2;……类型n成员n;}[变量序列];举例uniondata{inti;charch;floatf;};变量序列是可选项。uniondata{inti;charch;floatf;}a;说明共用体所占存储单元长度是成员的最大者。二、共用体与结构体的区别⒈结构体的每一个成员都占用自己的存储空间。共用体的每个成员共享同一个存储单元。⒉结构体所占存储空间的大小是所有成员所占空间大小的总和。共用体所占存储单元的大小是所有成员中占用空间最大的。三、共用体类型数据的访问格式变量名.成员名举例a.i引用共用体变量a中的整形变量ia.ch引用共用体变量a中的字符变量cha.f引用共用体变量a中的实型变量f说明不能只引用共用体变量,例如:printf("%d",a);×而应是:printf("%d",a.i);√printf("%c",a.ch);√printf("%f",a.f);√四、共用体类型数据的特点1.不能把共用体变量作为函数参数,也不能使函数带回共用体变量,但可以使用指向共用体变量的指针。2.共用体变量可以出现在结构体类型定义中,也可以定义共用体数组。反之,结构体也可以出现在共用体类型定义中,数组也可以作为共用体的成员。3.共用体变量不能进行比较操作。五、共用体程序举例

a.b.c1=a.b.c2=

#include<stdio.h>main(){union {intx; struct{charc1; charc2; }b; }a;a.x=0x1234; printf("a.b.c1=%#x\ta.b.c2=%#x\n",a.b.c1,a.b.c2);}0x340x12五、共用体程序举例(2)设置若干个人员的数据,其中有学生和教师。学生的数据中包含:姓名、号码、性别、职业、班级。教师的数据中包含:姓名、号码、性别、职业、职务。程序的数据结构tm2085wangsf1011liClasspositionjobsexnumnamestruct{ intnum; charname[10]; charsex,job;

union{ intclass;

温馨提示

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

评论

0/150

提交评论