《结构体与共用体》PPT课件_第1页
《结构体与共用体》PPT课件_第2页
《结构体与共用体》PPT课件_第3页
《结构体与共用体》PPT课件_第4页
《结构体与共用体》PPT课件_第5页
已阅读5页,还剩44页未读 继续免费阅读

下载本文档

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

文档简介

,内容回顾,基本类型,构造类型,指针类型,空类型,数组,结构体,共用体,数据类型,上述数据类型名不符合书写习惯怎么办?,存放相同类型的数据,C程序要求每个变量都要有自己的数据类型。,但是,自己定义类型名(标识符),一组类型不同的数据,怎么办?,第10章结构体与共用体,自定义类型标识符结构体的定义与引用共用体的定义与引用,10.1自定义类型标识符,C语言可以通过typedef语句,定义自己的数据类型。实际上是给C现有类型重新起个名字,即自定义类型标识符。,typedef语句的格式:,typedef现有类型名新类型名;,C语言的类型符,用户定义的类型符,例如:,基本类型,typedefintINTEGER;typedeffloatREAL;,数组,typedefintARRAY100;typedefchar*POINTER;,inti;floatx;,INTEGERi;REALx;,inta100,b100;char*pa,*pb;,ARRAYa,b;POINTERpa,pb;,1、先按定义变量的方法写出定义语句;如:inta10;2、将变量名用新类型名替换;如:intARRAY10;3、再在最前面加typedef;如:typedefintARRAY10;4、然后就可以用新类型名定义变量。如:ARRAYa,b,c;,用typedef定义新类型的步骤,注意:typedef并不创建新的类型,结构体导入,一组相同类型的数据我们可以用数组来处理,但是在实际应用中,经常有一些既有联系,类型又不同的数据需要一起处理。,如:学生的基本信息,字段:学号姓名性别地址成绩类型:longcharcharcharfloat,C语言允许用户按自己的需要将不同的基本类型构造成一种特殊类型,即结构体。,结构体的操作分为4步:,根据需要先定义结构体类型;然后通过定义的类型定义结构体变量(数组、指针);结构体变量(数组、指针)赋值(址);引用结构体变量(数组、指针)。,11.2结构体,定义结构体类型,格式:,struct结构名数据类型成员1;数据类型成员2;数据类型成员n;;,结构体标志。,用标识符命名的结构类型名。,结构类型中所含的成员及其类型。,再如定义学生结构体:structstudentlongnum;/*学号*/charname20;/*姓名*/charsex;/*性别*/intage;/*年龄*/floatscore;/*成绩*/;,如:日期结构体类型structdateintmonth;intday;intyear;,或:structdateintmonth,day,year;,;,结构体的内存结构,为了加快cpu的存取速度,VC+编译器在处理数据时经常把结构体成员的大小按照4或8的倍数计算,此即数据对齐。基本的原则:按成员类型大小从小到大声明。,经上面定义之后:structstudent和int,float等标准类型标识符一样可用来定义变量、数组、指针变量等,如:学生基本情况structstudentlongnum;charname20;charsex;intage;structdatebirthday;floatscore;;,structstudentlongnum;charname10;charsex;intage;structdateintyear;intmonth;intday;birthday;floatscore;;,结构体嵌套:,一个结构体成员可以又是一个结构体变量。,定义结构变量,定义结构只是确定该结构体类型的名称、成员及成员的类型。必须通过结构体类型定义变量,才能赋值并使用。,结构体变量的4种定义方式:,先定义结构体类型,再定义结构体变量。,structstudentlongnum;charname20;intage;charadd30;floatscore;,structstudentstd1,*pst,pers3;,用structstudent类型说明3个变量。,定义结构类型的同时定义结构体变量。,structstudentlongnum;charname20;charsex;intage;floatscore;std1,*pst,pers3;,直接定义结构体变量。,structlongnum;charname20;charsex;intage;floatscore;std,*pstd,pers3;,说明:,无结构体名。注意类型和变量的区别。成员可单独使用。如:std.age=20,用typedef将结构体类型定义新类型,再定义变量。,typedefstructstudentlongnum;charname20;charsex;intage;floatscore;STREC;,此处分号不能省略,STRECstd,*pstd,pers3;,定义变量,1、结构体变量的初始化,例如:,结构体变量名=初值;,注意:初值的个数、顺序、类型应与成员说明一致,结构体变量(数组、指针)的初始化,结构变量(数组、指针)可以在说明时赋初值,称为初始化。,格式:,structstudentstd=20001,LiLi,M,19,85;,2、结构体数组的初始化,struct结构体名*结构体数组名=初始数据;,structstudentpers3=20001,SunLin,M,19,85,20002,LiSi,W,19,85,20003,John,M,19,85;,格式:,例如:,前面4种定义形式均可在定义时对结构体进行初始化。,多项数据之间用逗号隔开。,结构体数组相当于一个广义的二维数组,结构体数组的初始化与二维数组的初始化类似。,3、结构体指针的初始化,struct结构体名*结构体指针变量名=charname20;char*sex;intage;charaddr30;wang=200989001,“王五,女,20,上海;printf(num=%ld,name=%s,sex=%s,age=%d,addr=%sn,wang.num,,wang.sex,wang.age,wang.addr);,源代码,结构体变量的引用,方式1:结构体变量名.成员名方式2:(*指针变量名).成员名方式3:指针变量名-成员名,1、结构体成员的引用(3种方式),若有:structstudentstd,pers3,*sp=等价于sp-age+;,.成员引用运算符-指向成员运算符,(1)对于结构体类型数组,要遵循数组元素的引用原则(或*)和结构体成员的引用原则(.或-)。,引用结构体成员时的注意事项:,pers2.age或(pers+2)-age或(*(pers+2).age,pers.age,2或sp-name2或(*sp).name2,,如:pers数组的第2个元素的成员age,如:成员name数组的第2个元素,(2)对于结构体嵌套,只能引用最低层的成员。,引用结构体成员时的注意事项:,structstudentlongnum;charname10;charsex;intage;structdateintyear;intmonth;intday;birthday;floatscore;std;,如:引用结构体变量std中的出生月份,std.birthday.monthsp-birthday.month(*sp).birthday.month,注意:由外向内逐层引用,每层之间用点号“.”分隔。,(3)可以对变量、数组元素及其成员进行取地址运算取结构体变量的地址为:charname20;charsex;floatscore;s1=20001,LiLi,M,85;structstudents2;floatsum,ave;scanf(%ld%s%c%f,定义变量s2、sum、ave,【例10.1】结构体类型变量的引用示例:求两个学生总成绩及平均成绩,输入第2个学生信息,计算这两个学生的总成绩、平均成绩,输出标题信息,输出这两个学生信息,输出其总成绩、平均成绩,例10.1(源代码),#includestdio.h#defineN10main()structstudentintnum;floatscore;studN;floatave=0,max;inti,k=0;printf(input:num,name,score);for(i=0;iname,p-score);,【例10.4】结构体指针变量的应用:求N个学生最高分及平均成绩,例10.4(源代码),2.对结构体类型变量的整体赋值,同种类型的结构体变量之间可以进行整体赋值操作。例如:structstudentlongnum;charname20:charsex;intage;floatscore;std1,std2=11011,YangLin,M,18,89;std1=std2;实际上是将std2的成员分别赋给std1中对应的同名成员。,函数之间结构体变量的数据传递,3种传递方式:用结构体变量的成员作参数结构体变量的成员可以看做普通变量。用指向结构体的指针作参数结构体变量的整体双向传递,形参的改变会影响到实参。用结构体变量的整体作参数结构体变量的整体单向传递,形参的改变不会影响到实参。,例题10.5,例题10.6,例题10.7,传递成员,6.用指针处理链表,链表作为一种常用的、能够实现动态存储分配的数据结构,是二级公共基础的数据结构部分的要点之一。链即用指针连接数据结点。本节重点讲述单链表,其模型如下:,(1)头指针head指向链表的首结点。(2)每个结点由2个域组成:数据域存储结点本身的信息。指针域指向后继结点的指针。(3)尾结点的指针域置空(NULL),作为链表结束的标志,1链表概述,语言对链表结点的结构描述在语言中,用结构类型来描述结点结构。例如:structslistintdata;/*数据域*/structslist*next;/*指针域*/;typedefstructslistSLIST;,用于动态分配空间的3个标准函数(stdlib.h)malloc(size);在内存的动态区申请1个长度为size的存储单元calloc(n,size);在内存的动态区申请n个长度为size的存储单元free(*ptr);释放由ptr指向的存储单元,2.链表的建立,例10.8编写一个creat()函数用于建立一个有5名学生基本数据的单向链表。,其算法步骤为:(1)定义一个描述学生基本数据的结构体类型。(2)定义三个指向结构体的指针p,q和head。其中head为头指针;p为当前结点的指针;q为当前链表的表尾结点指针。(3)建立第一个结点(4)建立其它节点并完成与当前链表的链接。重复步骤(4)就可以完成链表的建立。,3.链表的输出,例10.9编写输出链表的函数print()通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域将搜索到的每个节点的数据域的值输出,4.链表的删除,例10.10编写函数delete()实现链表的删除操作,基本思路:通过单链表的头指针,首先找到链表的第一个结点;然后顺着结点的指针域找到学号为num的结点,修改其前一个节点的指针域的值,使他指向他的下一个结点。,q-next=p-next;free(p);,5.链表的插入,例10.11编写插入结点的函数insert(),实现在有序链表中结点的插入操作(假设链表按照num(学号)从小到大顺序排列)。,基本思路:通过单链表的头指针,首先找到链表的第1个结点;然后顺着结点的指针域找到值为x的节点,然后将新结点y插入。,q-next=p;r-next=q;,例10.12编写主函数调用以上各函数,共用体是指不同类型的数据可以在不同的时间内使用共同的内存单元。尽管这些在内存中占的字节数不同,但都从同一起始地址开始存放。而且是在不同的时间内去使用该内存单元。共用体实际上是C语言提供的一种覆盖技术。,10.3共用体,charsex,shortnum,floatscore,共用体的定义、使用形式同结构体相似。union共用体名类型名1共用体成员名表1;类型名2共用体成员名表2;类型名n共用体成员名表n;;,1.共用体类型的定义,unionstudentintnum;charsex;floatscore;unionstudentstu1,stu2;,typedefunionintnum;charsex;floatscore;UN;UNs1,s2;,unionintnum;charsex;floatscore;stu1,stu2;,unionstudentintnum;charsex;floatscore;stu1,stu2;,2.共用体变量的定义,3.共用体变量的引用方式,共用体的使用也与结构体相同,用intmonth;intyear;unionintsh1;floatsh2;sh;a;,举例,例10.13分析下列程序的运行结果,main()unioncharc2;intk;r;r.c0=2;r.c1=0;r.k=20;printf(%d,%d,%dn,r.k,r.c0,r.c1);,20,20,0,【例10.14】分析下列程序的输出结果unionasinta;intb;s3,*p;main()intn=1,k;for(k=0;ka,+p-a);,3,3,+p-a,p-a);,3,2,+p-a,+p-a);,4,3,共用体与结构体的区别,structexaminta;floatb;charc;x;,x,a,b,c,unionexaminta;floatb;charc;x;,x,b,a,c,结构变量的每个成员有独立的内存单元,而共用体变量的成员以最大的成员开辟单元后,所有成员共用该单元。,sizeof(structexam),10.4枚举类型,枚举类型的定义格式:enum枚举类型标识符枚举元素表列;例如:enumdaysun,mon,tue,wed,thu,fri,sat;以上定义了一个枚举类型enumday,有个枚举元素。可以用此类型来定义变量。enumdayworkday;workday被定

温馨提示

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

评论

0/150

提交评论