C11结构体与共用体_第1页
C11结构体与共用体_第2页
C11结构体与共用体_第3页
C11结构体与共用体_第4页
C11结构体与共用体_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

第十一章结构体与共用体,教学目标掌握结构体类型及结构体变量的定义与引用方法;理解结构体变量的存储结构;初步掌握链表的概念及对链表的基本操作;了解共用体类型及共用体类型变量的定义;了解枚举类型的定义方法及枚举类型数据的使用;了解用typedef定义数据类型别名的方法。基本要求能够阅读、编写和调试有关结构体的应用程序,初步掌握有关链表的一些基本操作。,扁锯槛小平浇蜀懒匠尸黄丹宦清劝谍磕薄怕践哉毗陨摇割躁避杠啪利姜颗C11结构体与共用体C11结构体与共用体,第十一章结构体与共用体,11.1结构体类型结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型,struct结构体名类型标识符成员名;类型标识符成员名;.;,成员类型可以是基本型或构造型,struct是关键字,不能省略,合法标识符可省:无名结构体,一、结构体类型的定义,业水裳卒叫迷屑肘筒正卑挛拐虱淑程甲沂滥凰捻冲和撕闰妄透舍纬冤因持C11结构体与共用体C11结构体与共用体,structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;,结构体类型定义只描述结构的组织形式,不分配内存。,例:结构体类型的定义,堵曰衅悬愉稿爷凋米年孤骤镀碌至软董颜呢奉谤涌料纹吩苗勤淀蜡慈肇坝C11结构体与共用体C11结构体与共用体,struct结构体名类型标识符成员名;类型标识符成员名;struct结构体名变量名表列;,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;structstudentstu1,stu2;,1.先定义结构体类型,再定义结构体变量,二、结构体变量的定义(三种形式),一般形式1:,磁奇贾锦酷谓萝洁搔鼻因乖住堵妈尤章袱闸糙纷觉佯鹃惺向期史盯途俐垒C11结构体与共用体C11结构体与共用体,struct结构体名类型标识符成员名;类型标识符成员名;.变量名表列;,例structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,一般形式2:,2.定义结构体类型的同时定义结构体变量,辛精兰污浊讣目睡逝扭注铱她遇昏反躲诚赂疽睡蝇颗田钾胜屡孰氓辽鲤蕉C11结构体与共用体C11结构体与共用体,一般形式3:,struct类型标识符成员名;类型标识符成员名;.变量名表列;,例structintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;,用无名结构体直接定义变量,只能一次.,3.直接定义无名结构体变量,耿奠钩饲阿筋垫占氦轻朝伍步叭续答修幽瑚痊愿笆憋舒喘赌哼胆郝西饭签C11结构体与共用体C11结构体与共用体,结构体类型与结构体变量概念不同。类型:不分配内存;变量:分配内存类型:不能赋值,存取,运算;变量:可以赋值,存取,运算结构体类型可以嵌套定义。结构体类型及变量的作用域与生存期。,例structdateintmonth;intday;intyear;structstudentintnum;charname20;structdatebirthday;stu;,说明:,变量stu的存储结构:,孕拔言崩撂勿稻痛苫烩五钱捻歹夺辙树庞巡又筹蛛踊怔捎货拄疾则证怜舵C11结构体与共用体C11结构体与共用体,1.引用方式:结构体变量名.成员名,2.引用规则:结构体变量不能整体引用,只能引用变量成员,三、结构体变量的引用,成员(分量)运算符优先级:15(最高)结合性:从左向右,默兜铣刻垮萨坞悍影痕昆岁嚷塞格跌蚀昏翠渡俄姆慌垃儒豆釉酵疗热侨褂C11结构体与共用体C11结构体与共用体,结构体变量的引用示例,青褐南窗纂仑潘玫障鞠蓑铂异间崇焰屈哨达全取氦崇政郧茅叉彦券虽肚哺C11结构体与共用体C11结构体与共用体,例structstudentintnum;charname20;structdateintmonth;intday;intyear;birthday;stu1,stu2=101,WanLin;,stu1.birthday.month=12;,3.结构体嵌套时应逐级引用,stu1=102,WanLin;(),4.特例:C语言允许:将一个结构体变量的值整体赋值给另一个结构体变量。例如:stu1=stu2;(),揍罢畜倡臃俞洽爆依嗅虹损调做吊粘眨甭团发济割询蹿醋绎悄指卑吏赢铸C11结构体与共用体C11结构体与共用体,struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名结构体变量=初始数据;,例structstudentintnum;charname20;charsex;intage;charaddr30;structstudentstu1=112,WangLin,M,19,200BeijingRoad;,四、结构体变量的初始化形式一:,笺沃轴刻峨旷篷作夏阎鲍戎搽贾旨蛋蓝漠涝缮菲遂拽滩端承黄殖床谋快民C11结构体与共用体C11结构体与共用体,struct结构体名类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,例structstudentintnum;charname20;charsex;intage;charaddr30;stu1=112,WangLin,M,19,200BeijingRoad;,形式二:,实镁今品腿拒漓驱倡姥粉摇嚎钡蓖迸灶甸破揖玉误笨谓扔澈魁圣鞠雹欣负C11结构体与共用体C11结构体与共用体,struct类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;,例structintnum;charname20;charsex;intage;charaddr30;stu1=112,WangLin,M,19,200BeijingRoad;,形式三:,奎唾薯泪邯攘引助奇任块昨订困撅谜上摩潜伸灯敖揪访浓篓湾于阻磷坷忌C11结构体与共用体C11结构体与共用体,形式一:structstudentintnum;charname20;charsex;intage;structstudentstu2;,形式二:structstudentintnum;charname20;charsex;intage;stu2;,形式三:structintnum;charname20;charsex;intage;stu2;,11.2结构体数组一、结构体数组的定义,圈搪闽灸错君吴起鹰呕酒仰弱酬庭离匙私蕊盂台嘱觉鸦鹤寺悉泊闺拓阎骚C11结构体与共用体C11结构体与共用体,顺序初始化:structstudentintnum;charname20;charsex;intage;structstudentstu=100,WangLin,M,20,101,LiGang,M,19,110,LiuYan,F,19;,例:定义类型时省略类型名structintnum;charname20;charsex;intage;stu=,;,二、结构体数组初始化,乐员案恭而萍流配搽暖茎哎盼差臣袭刘撵总弧桔夫妈尉耿扭蔽堂乞恃啡醉C11结构体与共用体C11结构体与共用体,例:定义类型的同时定义变量并初始化structstudentintnum;charname20;charsex;intage;stu=,;,结构体数组初始化示例,等乙犁团挠墟耶情惕僻舞代翻公伴续衫胎愿有化判他娜霍腥仰茨减交嫩炬C11结构体与共用体C11结构体与共用体,引用方式:结构体数组名下标.成员名,structstudentintnum;charname20;charsex;intage;stu3;,stu1.age+;stu2.age=18;,strcpy(,ZhaoDa);,三、结构体数组引用,腆囱酪姨咬馅官悍软协智虫沽廷咱综想响隐拌绷崎聪朵醛梳懈辖厦户橡欧C11结构体与共用体C11结构体与共用体,structpersoncharname20;intcount;leader3=Li1,0,Zhang2,0,Wang3,0;voidmain()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;jname,p-sex,p-age);,例指向结构体数组的指针,二、指向结构体数组的指针,灿杨蓖房潜矣筋盏羌菇蓑殴墩精谚烷擂暮彼客谍度骸搁廷陋替荡白饰处蔑C11结构体与共用体C11结构体与共用体,11.4结构体与函数,1.结构体类型变量可以作为函数实参,structdatainta,b,c;main()voidfunc(structdata);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);printf(CallFunc().n);func(arg);printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);voidfunc(structdataparm)printf(parm.a=%dparm.b=%dparm.c=%dn,parm.a,parm.b,parm.c);printf(Process.n);parm.a=18;parm.b=5;parm.c=parm.a*parm.b;printf(parm.a=%dparm.b=%dparm.c=%dn,parm.a,parm.b,parm.c);printf(Return.n);,俩粹歼番予躲太篆截宽驾册木菏霄鲸镁装友搂芽根鞘敏且狄肃烹吧俘跨浸C11结构体与共用体C11结构体与共用体,2.函数可以返回结构体类型的值(例11.7),#include#includestructstudentcharnum10;charname20;floatscore;voidPrintStruct(structstudentstud)printf(%s%s%gn,stud.num,,stud.score);structstudentInitialStruct(char*num,char*name,floatscore)structstudentstud;strcpy(stud.num,num);strcpy(,name);stud.score=score;returnstud;voidmain()structstudentstud;stud=InitialStruct(00001,XiaoLi,98.5);PrintStruct(stud);,括概淀诡淳坐镰厂信迅物李铣短轿栓壮判斧坞豢烂苏紧浆丁萤钢逝萨赎蜜C11结构体与共用体C11结构体与共用体,structdatainta,b,c;voidmain()voidfunc(structdata*parm);structdataarg;arg.a=27;arg.b=3;arg.c=arg.a+arg.b;printf(arg.a=%darg.b=%darg.c=%dn,arg.a,arg.b,arg.c);printf(CallFunc().n);func(,3.用结构体指针变量作函数参数,肾椎秦雁搔质坤刀压档监孵作扬念敌殃涕偏兼核筐搓盾鼓撑苫见桐冠巍胳C11结构体与共用体C11结构体与共用体,11.5链表,链表是一种常见的重要数据结构,它的主要功能是进行动态存、取数据。链表的实现方式是:构造一个结构体,在此结构体中除了数据成员外;还有一个指针成员,用来记录下一个数据的位置。这样的结构体我们称之为链表中的结点。,图11.11链表结构示意图,structtag/*数据成员列表*/structtag*nextPtr;,蕴溶寄叔峙镇焕洗谐乾顽以描蓖意赘棺赞兑简搪凉绞逝激险扩脖圈墩讲夜C11结构体与共用体C11结构体与共用体,1.静态链表,#includestructnodeintdata;structnode*nextPtr;voidmain()structnodea,b,c,*h,*p;a.data=3;b.data=6;c.data=9;p=h=,运行结果为:369,泪射拉奔渝滥假弗侈额由询溺豹捐乓冒肄喧植淄酸梳摇勋锣堡军淹高躇垣C11结构体与共用体C11结构体与共用体,2.动态链表,p=(structnode*)malloc(sizeof(structnode)p-data=100;c.nextPtr=p;/*将新节点加到链表的尾部*/p-nextPtr=0;/*NULL*/p=(structnode*)malloc(sizeof(structnode)p-data=200;c.nextPtr.nextPtr=p;p-nextPtr=0;/*NULL*/free(p)/*从内存中将p所指向的内存块删除*/,肤盈椭巩她哑童妙婴汗获锰恤欣徒肠侵藐锈夯涌驻更羔酌违宿欣可今昔滥C11结构体与共用体C11结构体与共用体,NCRE2004年4月考题(几乎每次都考),#include#includestructNODEintnum;structNODE*next;voidmain()structNODE*p,*q,*r;intsum=0;p=(structNODE*)malloc(sizeof(structNODE);q=(structNODE*)malloc(sizeof(structNODE);r=(structNODE*)malloc(sizeof(structNODE);p-num=1;q-num=2;r-num=3;p-next=q;q-next=r;r-next=NULL;sum+=q-next-num;sum+=p-num;printf(sum=%dn,sum);/*sum=4*/free(p);free(q);free(r);,娱斜殊俺吸葵宜猴虱铰钮亏伟磕厩琵遮渡顶凹局烩厚馒缎粉钮佯眶料晦崖C11结构体与共用体C11结构体与共用体,union共用体名类型标识符成员名;类型标识符成员名;.;,例uniondatainti;charch;floatf;,类型定义不分配内存,共用体是一种构造数据类型,也叫联合体。用途:所有的成员均共用一段存储区域(相互覆盖)。一、共用体类型定义定义形式:,11.6共用体,虑惫碱僳处做吾术颂葛个馏尉补纫奏枉候写闪阎奈搀斥挂酗窿涤织摸稳白C11结构体与共用体C11结构体与共用体,形式二:uniondatainti;charch;floatf;a,b;,形式一:uniondatainti;charch;floatf;uniondataa,b,*p,d3;,形式三:unioninti;charch;floatf;a,b,c;,共用体变量定义分配内存,长度=最长成员所占字节数,二、共用体变量的定义,不癸陵澄疡拜窥恤沽癌贪哄毋赃梯瞧器陵煞核辆柏淄耽节稳丽音靶插尤尾C11结构体与共用体C11结构体与共用体,引用规则特例可以用一个共用体变量为另一个变量赋值,引用规则只能引用其成员,不能引用共用体变量。,uniondatainti;charch;floatf;uniondataa,b,d3,*p=d;,a.i=8;a.ch=A;a.f=1.5;,p-i;p-ch;p-f;,(*p).i;(*p).ch;(*p).f;,d0.i;d0.ch;d0.f;,三、共用体变量引用,a=1;(),b=a;(),悔惩磨过痴汕夺魏启极爷综苍苇吩疲彭悸吝眉娟金核屠坞二侈棘热傈华杏C11结构体与共用体C11结构体与共用体,#includeunioninti;charch;floatf;a;main()a.i=65;printf(a.i=%d,a,ch=%dn,a.i,a.ch);a.ch=a;printf(a.i=%d,a.ch=%dn,a.i,a.ch);a.f=1.5;printf(a.f=%f,a.i=%dn,a.f,a.i);,引用规则不能在定义共用体变量时初始化共用体变量中起作用的成员是最后一次存放的成员,例unioninti;charch;floatf;a=1,a,1.5;(),共用体变量引用示例,鬃伊颗氧溃桐携口猩颗孔挣帽汀貉昂阻疫悄致展千远继彪恶倘镀他掖曙婶C11结构体与共用体C11结构体与共用体,运行结果:i=60501ch0=101,ch1=141ch0=A,ch1=a,main()unionint_charinti;charch2;x;x.i=24897;printf(i=%on,x.i);printf(ch0=%o,ch1=%onch0=%c,ch1=%cn,x.ch0,x.ch1,x.ch0,x.ch1);,例将一个整数按字节输出,巴储讳笆茫连醉赘液痔警普伤棕溺太茹笔醇犊襄酷祝理渍侥颖膨栽撅团藻C11结构体与共用体C11结构体与共用体,区别:存储方式不同联系:两者可相互嵌套,四、结构体与共用体的区别,伎募性底摧塑向芹卑渗览故繁闹钥桥修巨奴浊羚悍悯肠昼献妄箭肠摧弊赎C11结构体与共用体C11结构体与共用体,structintnum;charname10;charsex;charjob;unionintclass;charposition10;category;person2;,例结构体中嵌套共用体,步协镊厨洞眠病蘸乘劝拧娠侥铺桌莉诚烦锄皮蜀烙幂诈达抛中功数犀聚侦C11结构体与共用体C11结构体与共用体,11.7枚举类型,C语言提供了另一种用户定义类型称为枚举(enumeration)。枚举就是用标识符表示的整数常量的集合,用关键字enum定义。从效果上看,枚举常量是自动设置值的符号常量。枚举常量的起始值默认为0,以后的值依次递增1。枚举类型的定义形式为:enum枚举类型名成员名=整数常量;如:enummonthsJAN,FEB,MAR;则:JAN=0,FEB=1,MAR=2。如:enummonthsJAN=1,FEB,MAR;则:JAN=1,FEB=2,MAR=3。如:enummonthsJAN=100,FEB,MAR=200;则:JAN=100,FEB=101,MAR=200。枚举型的作用:增加程序的可读性。,雄侵戌矾又尼仟姐峦桨蓄迂含农渡摔在万猜好膳似滓弥扫鼠婚作妄笺釜资C11结构体与共用体C11结构体与共用体,功能:用自定义名字为已有数据类型命名1.类型定义简单形式:typedeftypename;,例typedefintINTEGER;typedeffloatREAL;,类型定义语句关键字,已有数据类型名,用户定义的类型名,类型定义后,与已有类型一样使用,例INTEGERa,b,c;REALf1,f2;,说明:1.typedef没有创造新数据类型2.typedef是定义类型,不能定义变量3.typedef与define不同,definetypedef预编译时处理编译时处理简单字符置换为已有类型命名,11.8用typedef定义类型,犹嘻疚瑟庚纳迪氢牲哩戊萎设胆闭队赖挠闲赴磷始赫讯寇卜术抬腾劫秸厕C11结构体与共用体C11结构体与共用体,例定义数组类型inta100;intARRAY100;typedefintARRAY100;ARRAYa,b,c;,inta100,b100,c100;,按定义变量方法先写出定义体如inti;将变量名换成新类型名如intINTEGER;最前面加typedef如typedefintINTEGER

温馨提示

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

评论

0/150

提交评论