c语言 结构体 ppt,第8章C语言的结构体和共同体.ppt

《第8章C语言的结构体和共同体.ppt》由会员分享,可在线阅读,更多相关《第8章C语言的结构体和共同体.ppt(41页珍藏版)》请在皮匠网上搜索。

1、1第八章结构体、共用体和枚举类型8.1结构体8.2共用体8.3枚举类型8.4用typedef定义类型2结构体是一种构造数据类型用途:把不同类型的数据组合成一个整体-自定义数据类型struct结构体名类型标识符成员名;类型标识符成员名;.;成员类型可以是基本型或构造型struct是关键字不能省略合法标识符可省:无名结构体8.1.1结构体类型声明8.1结构体结构体类型定义3例structstudentintnumcharname20charsexintagefloatscorecharaddr30结构体类型定义描述结构的组织形式不分配内存结构体类型定义的作用域8.1结构体structstudent。

2、应作为一个类型整体,numname20等都只是其中的成员,且struct及“”后的“;”不能省略。48.1结构体例个人数据:包含姓名、性别、年龄、身高、体重、住址:structpersoncharname20;姓名charsex;性别intage;年龄floatheight;身高floatweight;体重charaddr50;住址;structdateintyear;年month;月day;日;例日期,包括年、月、日:58.1结构体如职工信息结构体类型为:structpersoncharname20姓名charaddress40地址floatsalary工资floatcost扣款struct。

3、datehiredate聘任日期结构体类型可以嵌套定义即一个结构体类型中的某些成员又是其他结构体类型68.1结构体8.1.2结构体变量的定义先定义结构体类型,再定义结构体变量一般形式:struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名变量名表列;例structstudentintnumcharname20charsexintagefloatscorecharaddr30structstudentstu1stu27定义结构体类型的同时定义结构体变量一般形式:8.1结构体struct结构体名类型标识符成员名;类型标识符成员名;.变量名表列;例structstudent。

4、intnumcharname20charsexintagefloatscorecharaddr30stu1stu288.1结构体直接定义结构体变量一般形式:struct类型标识符成员名;类型标识符成员名;.变量名表列;例structintnumcharname20charsexintagefloatscorecharaddr30stu1stu2用无名结构体直接定义变量只能一次98.1结构体说明:结构体类型与结构体变量概念不同类型:不分配内存;变量:分配内存类型:不能赋值、存取、运算变量:可以结构体可嵌套结构体成员名与程序中变量名可相同,不会混淆结构体类型及变量的作用域与生存期108.1结构体8。

5、.1.3结构体变量的引用引用规则结构体变量不能整体引用只能引用变量成员引用方式:结构体变量名.成员名成员(分量)运算符优先级:1结合性:从左向右如果结构体变量类型相同,可以将一个结构体变量赋值给另一个结构体变量结构体嵌套时逐级引用例;stu1=stu2例:stu1.birthday.day=23;stu1.birthday.month=8;stu1.birthday.year=2003;118.1结构体8.1.4结构体变量的使用1、结构体变量的初始化形式一:struct结构体名类型标识符成员名;类型标识符成员名;.;struct结构体名结构体变量=初始数据;例structstudentintn。

6、umcharname20charsexintagecharaddr30structstudentstu1=112“WangLin”M19“200BeijingRoad”128.1结构体形式二:struct结构体名类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;例structstudentintnumcharname20charsexintagecharaddr30stu1=112“WangLin”M19“200BeijingRoad”138.1结构体形式三:struct类型标识符成员名;类型标识符成员名;.结构体变量=初始数据;例structintnumcharname20char。

7、sexintagecharaddr30stu1=112“WangLin”M19“200BeijingRoad”148.1结构体2、结构体变量的输入输出不允许对结构体变量进行整体的输入输出如:scanf(“%s%c%d%f”structstudentintnumintagefloatscorestuvoidmain()printf(“Enternumagescore:“)scanf(“%d%d%f“程序运行过程:Enternumagescore:10011998.5num:1001age:19score:98.515结构体数组的定义形式一:structstudentintnumcharname2。

8、0charsexintagestructstudentstu2形式二:structstudentintnumcharname20charsexintagestu2形式三:structintnumcharname20charsexintagestu28.1结构体8.1.5结构体数组16例structintnumcharname20charsexintagestu=引用方式:结构体数组名下标.成员名structstudentintnumcharname20charsexintagestr3stu1.age+strcpy(stu0.name”ZhaoDa”)8.1结构体结构体数组的初始化结构体数组的。

9、引用17structpersoncharname20intcountleader3=“Li”0“Zhang”0”Wang“0main()intijcharleader_name20for(i=1i=10i+)scanf(“%s“leader_name)for(j=0j3j+)if(strcmp(leader_nameleaderj.name)=0)leaderj.count+for(i=0i3i+)printf(“%5s:%dn“leaderi.nameleaderi.count)例统计后选人选票8.1结构体188.1结构体8.1.6结构体指针变量一个指针变量可以指向一个结构体数组元素(将该结。

10、构体数组的数组元素地址赋给此指针变量)。例structintafloatbarr3pp=arr此时p指向arr数组的第一个元素,“p=arr”等价于“p=”则此时指针变量p此时指向arr1。定义形式:struct结构体名结构体指针名例structstudentp存放结构体变量在内存的起始地址19使用结构体指针变量引用成员形式指向运算符优先级:1结合方向:从左向右例intnintp=n=10structstudentstu1structstudentp=(p).num=1018.1结构体208.1结构体例输出数组中各元素中各成员的值。structstudentintnumcharname20ch。

11、arsexintagestructstudentstu3=10101“Zhang“M1810102“Li“M1910103“Wang“F20main()structstudentpprintf(“No.Namesexagen“)for(p=stupnump-namep-sexp-age)218.1结构体指针移动示意图:注意:如果p的初值为stu,即指向第一个元素,则p+1后指向下一个元素的起始地址。请区别:(+p)-num和(p+)-num指针p已定义为指向structstudent类型的数据,它只能指向该结构体类型数据,而不能指向一元素的某一成员(即p的地址不能是成员的地址)。如下面的赋值是。

12、错误的:p=&stu.name228.1结构体8.1.7结构体与函数1、结构体变量作函数参数有时需要将一个结构体变量的值传递给另一个函数可以:用结构体变量的成员作参数。用法和普通变量作实参是一样的,属“值传递”方式。形参与实参都用结构体变量直接将实参结构体变量的各个成员的值全部传递给形参的结构体变量。注意:实参和形参类型应当完全一致。23structdataintabcmain()voidfunc(structdata)structdataargarg.a=27arg.b=3arg.c=arg.a+arg.bprintf(“arg.a=%darg.b=%darg.c=%dn“arg.aarg.。

13、barg.c)printf(“CallFunc()n“)func(arg)printf(“arg.a=%darg.b=%darg.c=%dn“arg.aarg.barg.c)voidfunc(structdataparm)printf(“parm.a=%dparm.b=%dparm.c=%dn“parm.aparm.bparm.c)printf(“Process.n“)parm.a=18parm.b=5parm.c=parm.aparm.bprintf(“parm.a=%dparm.b=%dparm.c=%dn“parm.aparm.bparm.c)printf(“Return.n“)8.1结。

14、构体copy248.1结构体用指向结构体变量(或数组)的指针作实参,将结构体变量(或数组)的地址传给形参。形参为指针变量,实参为结构体变量的地址或指向结构体变量的指针。2、结构体指针作函数参数258.1结构体structdataintabcmain()voidfunc(structdataparm)structdataargarg.a=27arg.b=3arg.c=arg.a+arg.bprintf(“arg.a=%darg.b=%darg.c=%dn“arg.aarg.barg.c)printf(“CallFunc()n“)func(268.1结构体例有一个结构体变量stu,内含学生学号、姓。

15、名和三门课的成绩。要求在main函数中赋值,在另一函数print中将它们打印输出。程序如下。#include“string.h“#defineat“%dn%sn%fn%fn%fn“structstudentintnumcharname20floatscore3main()voidprint()structstudentstustu.num=12345strcpy(stu.name“LiPing“)stu.score0=67.5stu.score1=89stu.score2=78.5print(voidprint(structstudentp)printf(atp-nump-namep-scor。

16、e0p-score1p-score2)printf(“n“)278.1结构体值得指出的是,把一个完整的结构体变量作为参数传递,虽然合法,但要将全部成员值一个一个传递,既费时间又费空间,开销大,因此一般不采用。上例的print函数形参改用结构体变量后程序如下:注意:ANSIC允许用整个结构体作为函数的参数传递,但是必须保证实参与形参的类型相同。#include“string.h“#defineat“%dn%sn%fn%fn%fn“structstudentintnumcharname20floatscore3main()voidprint()structstudentstustu.num=123。

17、45strcpy(stu.name“LiPing“)stu.score0=67.5stu.score1=89stu.score2=78.5print(stu)voidprint(p)structstudentpprintf(atp.nump.namep.score0p.score1p.score2)printf(“n“)288.1结构体ANSIC还允许函数返回结构体类型的值。设有一个structstudent类型,结构体变量定义如下:structstudentstud30若函数()的功能是输入一个学生结构体数据,并将其返回给第i个学生记录studi即:for(k=0k30k+)studk=()。

18、3、返回结构体类型值的函数()函数定义如下:structstudent()intkstructstudentstudscanf(“%d“298.2共用体8.2.1共用体类型声明结构体类型定义构造数据类型也叫联合体用途:使几个不同类型的变量共占一段内存(相互覆盖)union共用体名类型标识符成员名;类型标识符成员名;.;例uniondatainticharchfloatf类型定义不分配内存308.2共用体8.2.2共用体变量定义形式一:uniondatainticharchfloatfab形式二:uniondatainticharchfloatfuniondataabcpd3形式三:unioni。

19、nticharchfloatfabc共用体变量定义分配内存长度=最长成员所占字节数共用体变量任何时刻只有一个成员存在318.2共用体8.2.3共用体变量的引用引用方式:结构体变量名.成员名引用规则不能引用共用体变量,只能引用其成员共用体变量中起作用的成员是最后一次存放的成员不能在定义共用体变量时初始化可以用一个共用体变量为另一个变量赋值共用体变量的地址和它的各个成员的地址相同共用体变量不能作函数参数,函数的返回值也不能是共用体类型共用体类型和结构体类型可以相互嵌套,共用体中成员可以为数组,甚至还可以定义共用体数组例unioninticharchfloatfaa=1()例a.i=1a.ch=aa。

20、.f=1.5printf(“%d”a.i)(编译通过,运行结果不对)例unioninticharchfloatfa=1a1.5()例floatxunioninticharchfloatfaba.i=1a.ch=aa.f=1.5b=a()x=a.f()328.2共用体例将一个整数按字节输出main()unionint_charinticharch2xx.i=24897printf(“i=%on“x.i)printf(“ch0=%och1=%onch0=%cch1=%cn“x.ch0x.ch1x.ch0x.ch1)运行结果:i=60501ch0=101ch1=141ch0=Ach1=a33结构体与。

21、共用体区别:存储方式不同联系:两者可相互嵌套348.3枚举类型8.3.1枚举类型的声明枚举类型定义枚举数据类型指这种类型变量的取值只能限于事前已经一一列举出来的值的范围enum枚举类型名枚举常量;枚举常量;.;例enumweekdaysunmontuewedthufrisat358.3枚举类型8.3.2枚举类型变量的定义形式一:enumweekdaysunmontuewedthufrisatab;形式二:enumweekdaysunmontuewedthufrisatenumweekdayab形式三:enumsunmontuewedthufrisatab;368.3枚举类型说明:enum是关键。

22、字,标识枚举类型,定义枚举类型时必须用enum开头。在定义枚举类型时,花括号中的枚举元素是常量,这些元素的名字是程序设计者自己指定的,命名规则与标识符相同。这些名字只是作为一个符号,以利于提高程序的可读性,并无其它固定的含义。枚举元素是常量,在编译器中,按定义时的排列顺序取值0、1、2、.。定义枚举类型时,可在枚举数据时通过“=”号规定序号,并影响后面的枚举数据的序号,后继序号以此递增。枚举元素是常量,不是变量,可以将枚举常量赋给一个枚举变量,但不能对枚举元素赋值。但在定义枚举类型时,可以指定枚举常量的值枚举值可以作判断比较整型与枚举类型是不同的数据类型,不能直接赋值,但可以通过强制类型转换赋。

23、值枚举常量不是字符串不能用下面的方法输出字符串“sun”:printf(“%s“sun)()而应用检查的方法去处理:if(week1=sun)printf(“sun“)37例某口袋中有红、黄、蓝、白、黑五种颜色的球若干个,每次从口袋中取出三个球,问得到三种不同颜色的球有多少种取法,并输出每种组合结果。8.3枚举类型for(n=0,i=1;i=5;i+)取第一个球for(j=1;j=5;j+)取第二个球if(i!=j)第一个与第二个不同色for(k=1;k=5;k+)取第三个球if(k!=i)&(k!=j)n+;统计有多少种取法printf(%d,%d,%dn,i,j,k);输出一种取法不用枚举。

24、类型:388.3枚举类型采用枚举类型来描述数据。设用red表示红色球,yellow表示黄色球,blue表示蓝色球,white表示白色球,black表示黑色球。39main()enumcolorred,yellow,blue,white,black;enumcolori,j,k,l;intn,m;for(n=0,i=red;i=black;i+)for(j=red;j=black;j+)if(i!=j)for(k=red;k=black;k+)if(k!=i);caseblack:printf(%8s,black);break;printf(n);printf(总的取法有%d种n,n);408.。

25、4用typedef定义类型8.4.1typedef的概念功能:用自定义名字为已有数据类型命名类型定义简单形式:typedeftypename类型定义语句关键字已有数据类型名用户定义的类型名例typedefintINTEGER例typedeffloatREAL类型定义后与已有类型一样使用例INTEGERabcREALf1f2说明:1.typedef没有创造新数据类型2.typedef是定义类型不能定义变量3.typedef与define不同definetypedef预编译时处理编译时处理简单字符置换为已有类型命名418.4用typedef定义类型8.4.2typedef的用法typedef定义类。

26、型步骤按定义变量方法先写出定义体如inti将变量名换成新类型名如intINTEGER最前面加typedef如typedefintINTEGER用新类型名定义变量如INTEGERij例定义数组类型inta100intARRAY100ypedefintARRAY100ARRAYabcinta100b100c100例定义指针类型charstrcharSTRINGtypedefcharSTRINGSTRINGps10charpchars10例定义函数指针类型int(p)()int(POWER)()typedefint(POWER)()POWERp1p2int(p1)()(p2)()例定义结构体类型st。

27、ructdateintmonthintdayintyeard例定义结构体类型structdateintmonthintdayintyearDATE例定义结构体类型typedefstructdateintmonthintdayintyearDATE例定义结构体类型DATEbirthdaypstructdateintmonthintdayintyearbirthdayp类型定义可嵌套例typedefstructclubcharname20intsizeintyearGROUPtypedefGROUPPGPGpclubGROUPpclubstructclubpclubGROUP为结构体类型PG为指向GROUP的指针类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值