C语言教程课件ch.ppt
《C语言教程课件ch.ppt》由会员分享,可在线阅读,更多相关《C语言教程课件ch.ppt(54页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第11章 结构体与共用体1 概述2 定义结构体类型变量的方法3 结构体变量的引用4 结构体变量的初始化5 结构体数组6 指向结构体类型数据的指针7 用指针处理链表8 共用体9 枚举类型10 用typedef定义类型本章学习目标本章学习目标理解结构体的概念和它对于编程的重要性;理解结构体的概念和它对于编程的重要性;理解理解定义结构体类型定义结构体类型和和定义结构体变量定义结构体变量的区别;的区别;能够用能够用“.”和和“-”分量运算符操作结构体分量运算符操作结构体变量和指向结构体的指针变量;变量和指向结构体的指针变量;能够定义并使用结构体数组;能够定义并使用结构体数组;了解共用体数据类型了解共用
2、体数据类型;自学了解枚举类型的使用;自学了解枚举类型的使用;了解用了解用typedef定义数据类型。定义数据类型。11.1 概述概述v数据的基本类型:整、实、字符。数据的基本类型:整、实、字符。v数组是构造类型:每个元素为同一类型数组是构造类型:每个元素为同一类型v有些问题仅用基本类型和数组来描述,无法反映有些问题仅用基本类型和数组来描述,无法反映其内在联系,如学生情况:其内在联系,如学生情况:numnamesexagescoreaddr整字符串字符整实字符串11001Zhang xinm1996.5Shang hai12001Wang lif2098.5Bei jing上述数据互相独立又相互
3、关联,如:均与学号和姓上述数据互相独立又相互关联,如:均与学号和姓名关联。需要将其组合成一个有机的整体,名关联。需要将其组合成一个有机的整体,C语言可以将语言可以将由不同类型数据组成的这种数据结构组织成一个组合项,由不同类型数据组成的这种数据结构组织成一个组合项,称为称为结构体结构体(structure)。)。结构体结构体v结构体是结构体是一种一种构造构造数据类型。数据类型。与其他高级语言中的与其他高级语言中的“记录记录”类似。类似。v定义:由定义:由相互关联相互关联的的不同数据类型不同数据类型的数据组成的的数据组成的有机整体。有机整体。v用途:为处理复杂的数据结构提供了手段。用途:为处理复杂
4、的数据结构提供了手段。为函数间传递不同类型的参数提供了便利。为函数间传递不同类型的参数提供了便利。v关键字:关键字:struct结构体类型定义结构体类型定义struct结构体名结构体名类型标识符类型标识符成员名成员名1;类型标识符类型标识符成员名成员名2;.;成员类型可以是成员类型可以是基本型或构造型基本型或构造型struct是是关键字关键字,不能省略不能省略合法标识符合法标识符可省可省:无名结构体无名结构体;不能省略不能省略注意:这只是声明一种数注意:这只是声明一种数注意:这只是声明一种数注意:这只是声明一种数据类型并没有定义变量。据类型并没有定义变量。据类型并没有定义变量。据类型并没有定义
5、变量。structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;namenumsexagescoreaddr2字节字节2字节字节20字节字节1字节字节4字节字节30字节字节.结构体类型结构体类型定义定义仅描述结构体的组成仅描述结构体的组成,不分配内存空间不分配内存空间11.2 定义结构体类型变量的方法定义结构体类型变量的方法声明结构体类型时不分配存储单元,使用该类型定声明结构体类型时不分配存储单元,使用该类型定义变量时才分配存储单元。定义变量方法义变量时才分配存储单元。定义变量方法3种:种:先声明先声明结构体结构体类
6、型类型,再定义再定义结构体结构体变量变量structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;structstudentstu1,stu2;定义结构体定义结构体类型类型定义结构体定义结构体变量变量真正可以使用的变量真正可以使用的变量struct结构体名结构体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.;struct结构体名结构体名变量名表列变量名表列;声明结构体声明结构体类型类型的的同时同时定义结构体定义结构体变量变量只有在定义了只有在定义了结构结构体变量体变量后系统才为后系统才为
7、其其分配内存分配内存。structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;定义结构体定义结构体类型类型定义结构体定义结构体变量变量struct结构体名结构体名类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.变量名表列变量名表列;直接定义结构体类型变量直接定义结构体类型变量用用无名结构体无名结构体直接直接定义变量定义变量只能一次只能一次struct类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.变量名表列变量名表列;structintnum;
8、charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;说明说明v结构体类型与结构体变量概念不同结构体类型与结构体变量概念不同l类型类型:不分配内存;不分配内存;变量变量:分配内存分配内存l类型类型:不能赋值、存取、运算不能赋值、存取、运算;变量变量:可以可以v结构体变量中的成员可单独使用,方法如普通变量;结构体变量中的成员可单独使用,方法如普通变量;v结构体可嵌套结构体可嵌套structdateintmonth;intday;intyear;structstudentintnum;charname20;structdatebirth
9、day;stu;numnamebirthdaymonthdayyearprintf(%d,sizeof(stu);structstudentintnum;charname20;structdateintmonth;intday;intyear;birthday;stu;结果:结果:28v结构体成员名与程序结构体成员名与程序中变量名可相同中变量名可相同v结构体成员名与程序中变量名可相同,两者不代结构体成员名与程序中变量名可相同,两者不代表同一个对象。表同一个对象。structstudentintnum;charname20;floatscore;stu;intnum;stu.numnum11.3
10、结构体变量的引用结构体变量的引用引用规则引用规则v结构体变量结构体变量不能整体引用不能整体引用,只能引用变量只能引用变量成员成员结构体变量名结构体变量名.成员名成员名成员成员(分量分量)运算符运算符优先级优先级:1结合性结合性:从左向右从左向右structstudentintnum;charname20;charsex;intage;floatscore;charaddr30;stu1,stu2;stu1.num=10;stu1.age+;stu1.score=85.5;stu1.score+=stu2.score;voidmain()structstudentintNo;floatscore
11、;stu1,stu2;scanf(“%d,%f”,&stu1);()scanf(“%d,%f”,&stu1.No,&stu1.score);()printf(“%d,%f”,stu1);()printf(“%d,%f”,stu1.No,stu1.score);()stu2=stu1;()v结构体成员本身又是一个结构体类型,则需要找结构体成员本身又是一个结构体类型,则需要找到最低一级的成员。到最低一级的成员。structstudentintnum;charname20;structdateintmonth;intday;intyear;birthday;stu1,stu2;numnamebirt
12、hdaymonthdayyearstu1.birthday.month=12;v结构体变量的成员与普通变量用法相同。结构体变量的成员与普通变量用法相同。11.4 结构体变量的初始化结构体变量的初始化形式一形式一struct结构体名结构体名类型标识符类型标识符成员名成员名1;类型标识符类型标识符成员名成员名2;.;struct结构体名结构体名结构体变量结构体变量=初始数据初始数据;structstuintnum;charname20;intage;charaddr30;structstua=112,“WangLin”,19,“200BeijingRoad”;形式二形式二struct结构体名结构体
13、名类型标识符类型标识符成员名成员名1;类型标识符类型标识符成员名成员名2;.结构体变量结构体变量=初始数据初始数据;structstuintnum;charname20;intage;charaddr30;a=112,“WangLin”,19,“200BeijingRoad”;形式三形式三struct类型标识符类型标识符成员名;成员名;类型标识符类型标识符成员名;成员名;.结构体变量结构体变量=初始数据初始数据;structintnum;charname20;charsex;intage;charaddr30;stu1=112,“WangLin”,M,19,“200BeijingRoad”;#
14、includevoidmain()structstudentlongintnum;charname20;charsex;charaddr20;a=89031,“LiLin”,M,“123BeijingRoad”;printf(No.:%ldnname:%snsex:%cnaddress:%sn,a.num,a.name,a.sex,a.addr);例例11.1对结构体变量初始化对结构体变量初始化运行结果:运行结果:No.:89301name:LiLinsex:Maddress:123BeijingRoad11.5 结构体数组结构体数组具有相同结构的结构体也可以组成数组具有相同结构的结构体也可以
15、组成数组定义结构体数组:定义结构体数组:3种形式种形式形式一形式一:间接定义间接定义structstudentintnum;charname20;charsex;intage;structstudentstu2;numnamesexagenumnamesexagestu0stu125B形式二形式二:直接定义直接定义structstudentintnum;charname20;charsex;intage;stu2;形式三形式三:直接定义直接定义structintnum;charname20;charsex;intage;stu2;结构体数组初始化结构体数组初始化struct结构名结构名结构数组
16、名结构数组名数组长度数组长度=初始数据初始数据;定义数组时初始化定义数组时初始化:structstudentintnum;charname20;charsex;intage;structstudentstu3=100,“WangLin”,M,20,101,“LiGang”,M,19,110,“LiuYan”,F,19;全部初始化时维数可省全部初始化时维数可省按顺序定义时:按顺序定义时:内层括号内层括号可以省略可以省略声明结构体时,对结构体数组初始化声明结构体时,对结构体数组初始化:structstudentintnum;charname20;charsex;intage;stu3=100,“W
17、angLin”,M,20,101,“LiGang”,M,19,110,“LiuYan”,F,19;全部初始化时维数可省全部初始化时维数可省按顺序定义时:按顺序定义时:内层括号内层括号可以省略可以省略结构体数组应用结构体数组应用structstudentintnum;charname20;charsex;intage;structstudentstu=100,“WangLin”,M,20,;stu0.age+;strcpy(stu0.name,“ZhaoDa”);#include#includestructpersoncharname20;intcount;leader3=“Li”,0,“Zha
18、ng”,0,”Wang“,0;voidmain()inti,j;charleader_name20;for(i=1;i=10;i+)scanf(%s,leader_name);for(j=0;j3;j+)if(strcmp(leader_name,leaderj.name)=0)leaderj.count+;printf(n);for(i=0;i3;i+)printf(%5s:%dn,leaderi.name,leaderi.count);例例11.2统计候选人选票统计候选人选票全局结构体数组全局结构体数组“.”“.”成员运算符优先于成员运算符优先于“+”“+”,所以所以Leaderj.cou
19、nt+Leaderj.count+相当于相当于(learerj.count)+(learerj.count)+namecountLiZhangWang000namecountLiZhangWang43311.6 指向结构体类型数据的指针指向结构体类型数据的指针v存放结构体首地址存放结构体首地址v结构指针的运算按照结构指针的运算按照C语言的地址运算原则进行语言的地址运算原则进行.例如,结构指针加一将指向内存中下一个结构体。例如,结构指针加一将指向内存中下一个结构体。指向结构体变量的指针指向结构体变量的指针v定义形式:定义形式:struct结构体名结构体名*结构体指针名结构体指针名;例例struc
20、tstudent*p;存放结构体变量在存放结构体变量在内存的起始地址内存的起始地址numnamesexagestupstructstudentintnum;charname20;charsex;intage;stu;structstudent*p=&stu;v使用结构体指针变量引用成员形式使用结构体指针变量引用成员形式例例intn;int*p=&n;*p=10;n=10structstudentstu1;structstudent*p=&stu1;stu1.num=101;(*p).num=101以下三种形式等价:以下三种形式等价:结构体变量名结构体变量名.成员名成员名stu.num=101;
21、(*结构体指针名结构体指针名).成员名成员名(*p).num=101结构体指针名结构体指针名成员名成员名pnum=101指向运算符指向运算符优先级优先级:1结合方向:从左向右结合方向:从左向右()不能少!不能少!#include#includevoidmain()structstudentlongintnum;charname20;charsex;floatscore;stu_1,*p;p=&stu_1;stu_1.num=89101;strcpy(stu_1.name,LiLin);(*p).sex=M;pscore=89.5;printf(nNo:%ldnname:%snsex:%cnsc
22、ore:%fn,(*p).num,pname,stu_1.sex,pscore);例例11.3指向结构体变量的指针的应用指向结构体变量的指针的应用v注意区分以下三种运算注意区分以下三种运算p np n+p nstructsintx;inty;data4=10,100,20,200,30,300,40,400;main()structs*pointer=data;printf(“%dn”,+pointerx);printf(“%dn”,(+pointer)y);printf(“%dn”,(pointer+)x);printf(“%dn”,(pointer)y+);运行结果:运行结果:112002
23、0300取取x x值加值加1 1后输出后输出地址加地址加1 1后再取后再取y y值值先取先取x x值地址再加值地址再加1 1y y值输出后再加值输出后再加1 1指向结构体数组的指针指向结构体数组的指针v结构体数组及其元素可用指针变量来指向结构体数组及其元素可用指针变量来指向v数组首地址赋给指向结构体类型的指针变量时,数组首地址赋给指向结构体类型的指针变量时,当指针变量增当指针变量增1时,指向下一个数组元素。时,指向下一个数组元素。#includestructstudentintnum;charname20;charsex;intage;stu3=10101,LiLin,M,18,10102,Z
24、hangFun,M,19,10104,WangMin,F,20;voidmain()structstudent*p;for(p=stu;pstu+3;p+)printf(%d%s%c%dn,pnum,pname,psex,page);numnamesexagestu0pstu1stu2p+1例例11.4指向结构体数组的指针的应用指向结构体数组的指针的应用用结构体变量和指向结构体的指针作函数参数用结构体变量和指向结构体的指针作函数参数将一个结构体变量的值传递给另一函数将一个结构体变量的值传递给另一函数,方法有,方法有3种:种:v用结构体变量的成员作函数实参用结构体变量的成员作函数实参-值传递值传
25、递l注意形、实的类型要一致。注意形、实的类型要一致。v用指向结构体变量或数组的指针作实参用指向结构体变量或数组的指针作实参-地址传递地址传递l传递的是结构体变量的地传递的是结构体变量的地址。址。v用结构体变量作参数用结构体变量作参数-多值传递多值传递,效率低,效率低l将结构体变量所占的内存单元的内容全部顺序传递给形参,要将结构体变量所占的内存单元的内容全部顺序传递给形参,要求形参与实参同类型。函数调用是单值传递,且形参占用内存求形参与实参同类型。函数调用是单值传递,且形参占用内存单元,若形参的值被改变,不会返回主调函数。单元,若形参的值被改变,不会返回主调函数。#include#include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 教程 课件 ch
限制150内