七章节结构体与共用体

上传人:汽*** 文档编号:569177195 上传时间:2024-07-28 格式:PPT 页数:57 大小:328KB
返回 下载 相关 举报
七章节结构体与共用体_第1页
第1页 / 共57页
七章节结构体与共用体_第2页
第2页 / 共57页
七章节结构体与共用体_第3页
第3页 / 共57页
七章节结构体与共用体_第4页
第4页 / 共57页
七章节结构体与共用体_第5页
第5页 / 共57页
点击查看更多>>
资源描述

《七章节结构体与共用体》由会员分享,可在线阅读,更多相关《七章节结构体与共用体(57页珍藏版)》请在金锄头文库上搜索。

1、韶麻栖湘篷倍蹭贴娇肯杠服枕优鸯卞膘唱抉珍干罩俐古猾仅痊叠刻宴推隅七章节结构体与共用体第七章 结构体与共用体第七章 结构体与共用体高级语言程序设计高级语言程序设计 莆田学院现代教育技术中心 2004年年3月月 制作制作薪陡哨峭窟宏塑迄葡存庐带施条氨诸挪维玄梧膨您崖昏吁犯划贿犯怯俞露七章节结构体与共用体第七章 结构体与共用体本章主要内容 本章介绍:如何自己构造数据类型本章介绍:如何自己构造数据类型( (构造型数据构造型数据) )l结构体l内存分配函数l共用体l枚举类型l类型定义怂剐宜粗褪肛莎尘嚣撰揍牌元兆蓝勿兰号搓邮馅娘这堡豆旺死果燥乳挠堆七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育

2、技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月C(C+)数据类型殷颊雷迄惕予仇式扶颠闪庸较昂条鲤斜疼铣弄久嫩质酵密庄骆佳抓给腔鬼七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月一、结构体1概述l数 组 是构造类数据,其数组元素必须是同一数据类型的。l结构体 也是构造类数据,但其成员可以是任何类型的。 构造类型使用户可以象处理单个变量一样来处理复构造类型使用户可以象处理单个变量一样来处理复杂的数据结构。杂的数据结构。 诸如学生花名册、通讯录之类的数据,最适合用结构体来处理。因为这类数据具有如下特点:每

3、个人信息都是一个复合的构造数据,如由姓名、学号、性别、年龄、家庭住址、联系电话等“成员”组成。不同的人,数据的值不同,但都有共同的成员组成。事防俞贰舱侥糕麓蝉蜡庙定布禄番苑漫蹲拟低插原醉蔚酒疼怠瘪藩毁个养七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月使用结构体的一般步骤l根据问题的要求定义一个结构体类型l用自己定义的结构体类型定义结构体变量l在程序中使用结构体变量处理问题 比较普通变量的情况:l用系统给定的数据类型定义变量l在程序中使用变量处理问题瑟缘朋寺矽崇裕吵鸥蚤澜此志壳烙函狱悯沼宋搪也院瞻癌阐抓睦姿苟没盏七章节

4、结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月如何定义结构体类型? struct 结构体名 类型标识符 成员名; ; 关键字 用户指定/*struct 结构体名合称“结构类型标识符”*/*成员表列*/*此处分号不能省略*/姿蹿孟诞动颅撞藤嗓骸东土吓海鼓叭扰聚阁宿钧滑琶王春删闰扼丸些宫噪七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月一个示例【例一】main() struct student int number; char name6; char

5、sex; int age; char address20; ; 本质上,它定义了一个名为”student”的“结构体类型”(表头)。numberName6sexageAddress20锁淫挪骸粕播流赔镜靠眉娥掳蕴惶浊垒凝俐娠靴空资鸳照一于团巍妹混酞七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月小结:什么是“结构体类型”?l用户自己定义的构造型数据类型l由若干数据项(成员)组成l同一结构体中的成员可以具有不同的数据类型l注意成员定义与普通变量定义的区别: 成员定义时不为其分配内存 变量定义时为其分配内存淋申勒耗窃纳再引

6、猴佩茹彭袁盖墓疲郊绰熏誓煌塘唇帽缎此糊面稠踊掘揖七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月结构体类型的特点: l组成结构体的成员本身必须是一种已有定义的数据:n n基本类型成员(整型基本类型成员(整型/ /字符型字符型/ /实型)实型)n n指针类型成员指针类型成员n n数组类成员数组类成员n n其他构造类成员其他构造类成员( (包括已定义的另一种结构体)包括已定义的另一种结构体)P262P262 注意:成员注意:成员 变量,故成员名可与变量名同名变量,故成员名可与变量名同名 P263P263l l结构体类型可以

7、有千千万万种,表示由若干不同数据项组结构体类型可以有千千万万种,表示由若干不同数据项组 成的复合类型。成的复合类型。l l定义结构体类型时,系统不会为该结构体分配内存(只是定义结构体类型时,系统不会为该结构体分配内存(只是定义类型,而非变量声明)定义类型,而非变量声明)丹内穴块劫什衍腥擅喳豌墟雇邮操蓝蚕淄循玻芋帧更勃制硫根采戈柯氟替七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月2、结构体类型变量的定义 定义了以上结构体类型后,struct studentstruct student 相当于标准数据类型关键字char,

8、 int ,floatchar, int ,float我们可以用它来定义我们可以用它来定义“ “结构体变量结构体变量” ”。 在结构体类型定义后,用在结构体类型定义后,用 struct struct 结构体名结构体名 复合词定义复合词定义 struct struct 结构体名结构体名 ; struct struct 结构体名结构体名 变量名变量名1 1,变量名,变量名2 2, 变量名变量名n;n; 如:如:struct student a,b30,*p;struct student a,b30,*p; a a 为为struct studentstruct student类型的变量类型的变量 b

9、 b 为为struct studentstruct student类型的数组(每个元素都是一个结构类型的数组(每个元素都是一个结构 体变量,都有众成员)体变量,都有众成员) p p 为指向为指向struct studentstruct student类型的指针变量类型的指针变量飞道山蒲货绸晚墓岭棉对艾琳沪毋痒抖须雁罗养蔷页饲含张娄擒馈渊把巫七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月还有两种合二为一方法 在定义结构体类型的同时定义结构体类型变量 struct 结构体名 变量名1,变量名2, 变量名n; 直接定义结构

10、体类型变量 struct 变量名1,变量名2, 变量名n;实际使用中,还可以使用以下形式:先定义 #define STU struct student尔后 STU student1,student2;舶绦揍冷筋卸帚悍因宪鲜陋刹筐心删二贯貌烙檀草孤殊瓦府态雄藤异街喳七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月【例二】定义结构体类型的同时定义结构体类型变量。main() struct student int number; char name6; char sex; int age; char address20; a

11、,b30,*p; 【例三】不定义结构体类型,直接定义结构体类型变量。main() struct int number; char name6; char sex; int age; char address20; a,b30,*p; 沸颤仑歪粮罩宽壹尼串断钎粉尊节翻花洛坚巩杂颂范辊椭贿麻锈浴巷锐撅七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月其他有关知识l实际使用中,还可以使用以下形式: #define STU struct student STU stu1,stu2;l 比较一下两种变量定义方式的异同: int i

12、nt a,b,ca,b,c; ; 定义三个整型变量,每个变量占二个字节,可单定义三个整型变量,每个变量占二个字节,可单独赋值。独赋值。struct studentstruct student a,b,ca,b,c; ; 定义三个结构体类型变量,每个变量下有若干定义三个结构体类型变量,每个变量下有若干“ “成员成员” ”。其占用的内存长度等于各成员项长度之。其占用的内存长度等于各成员项长度之和。和。察航经钻咙观檄饮卡惰加艘鸿薪郧纽夫琅主刨翘肝挪躁殿烈特难寸辟坚眨七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例【例四】

13、main() struct student int number; char name6; char sex; int age; char address20; ; printf(%dn ,sizeof(struct student); 结果: 31帘柳烫巴旁否疾专窑定帧矩觉捍峪货懦泵忘册宣桩擂给矽魏硼彩旭祈缝芹七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例【例五】若有以下定义,则正确的赋值语句为 。 struct complex float real; float image; ; struct value i

14、nt no; struct complex com; val1;A) com. .real=1; B) val1. .complex. .real=1;C) val1. .com. .real=1; D) val1. .real=1;答案:C).real=1 夯棘帝襟资骸俺封死蛮罚锯蒂鹏栏芒柯原建檄球户钎累蓑瘩杰炼攒籽程面七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月3、结构体变量的初始化和赋值l使一个结构体变量获得数据“值”(实际上是给其各个成员赋值)有三种方法: 定义时初始化之定义时初始化之 用赋值语句对各成员分

15、别赋值用赋值语句对各成员分别赋值 同类型的结构体变量间相互赋值同类型的结构体变量间相互赋值 如如 student1=student2 student1=student2 追冗互沮瓶浇图穿辐敢窜淑赃糕捶箔空晨羚架眯迹画嫩捏井胡攘球蛙燕木七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例: 定义时初始化之【例六】main() struct char name15; char class12; long num; stu=Wenli,Computer,200113; printf(%sn%sn%ldn,stu.name,s

16、tu.class,stu.num);结果:结果:WenliWenli Computer 1 Computer 1 200113 200113捍员鸽噬戎臂捷玛敦范遇邮甄椭扳蓄座唯缚厘给培轧谤窥路没谅纪顾勃丽七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例: 用赋值语句对各成员分别赋值 【例七】main() main() struct struct char name15; char name15; char class12; char class12; long num; long num; stu=Wenli,Co

17、mputer,200113; stu=Wenli,Computer,200113; stu.name0=1; stu.name0=1; stu.class2=A; stu.class2=A; stu.num=1111; stu.num=1111; printf(%s,%s,%dn,stu.name,stu.class,stu.num); printf(%s,%s,%dn,stu.name,stu.class,stu.num); 结果:结果:1enli,CoAputer,11111enli,CoAputer,1111 惟娃皑北嗅蒂悠馏倍按牌汽贼涉路凑媚百剑颇沈犊温每吟崎代让砰苇辆椭七章节结构体与

18、共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例: 用赋值语句对各成员分别赋值 【例七】main() main() struct struct char name15; char name15; char class12; char class12; long num; long num; stu=Wenli,Computer 1,200113; stu=Wenli,Computer 1,200113; stu.name0=1; stu.name0=1; stu.class2=A; stu.class2=A; stu.num=1

19、111; stu.num=1111; printf(%s,%s,%dn,stu.name,stu.class,stu.num); printf(%s,%s,%dn,stu.name,stu.class,stu.num); 结果:结果:1enli,CoAputer,11111enli,CoAputer,1111 曝葱筐毗受凄苟吩揽右寺劣屋舱菏绽蒂伪裹铡吭聪励稻谴瞳脸哟吨玩宵偷七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月 进行所谓“结构体变量赋值”只能逐个成员进行,不能将结构体变量作为一个整体进行输入和输出。如对结构体

20、变量stu,以下语句是错误的: scanf(“%s,%s,%ld”,stu); printf(“%s,%s,%ld”,stu);正确编程:main() struct char name15; char class12; long num; stu; scanf(%s,stu.name); scanf(%s,stu.class); scanf(%ld,&stu.num); printf(%s,%s,%ldn,stu.name,stu.class,stu.num);亦可用以下赋值语句:strcpy(stu.name,”wenli”); strcpy(stu.class, “Computer”);s

21、tu.num=200113;为什么啊?但是如果改为stu.name=”wenli”是错误的。 说跑垄忌框诞郭叼溺爪田扎陶班勾骨氧胁佬艺约驼辨值留福总鸟甲怎佰繁七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月4、结构体变量的引用 l 只能引用其成员变量只能引用其成员变量 用圆点(成员运算符)用圆点(成员运算符)优先级最高优先级最高 如如 val1.no+ val1.no+ sum=.real+.image sum=.real+.imagel可以将成员变量按普通变量运算方式处理,包括可以将成员变量按普通变量运算方式处理,包

22、括取地址:取地址: &val1 &val1 (函数间传递用)(函数间传递用) &val1.no &val1.nol对多级结构体,只能对最低级的成员进行赋值、对多级结构体,只能对最低级的成员进行赋值、存取及运算处理。存取及运算处理。慑祭碟痢匀肚戳育请沽壮腊窥宇曲苹丛跃凛澄碌醋末嘻锁嫉筐飞集詹糙砾七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例l以下函数getdays( )计算某年某月某日是该年的第几天。如2001年2月5日是该年的第36天 。 闰 年 的 二 月 有 29天 , 表 达 式“(year%4=0&yea

23、r%100!=0)|(year%400)=0”值为真,即为闰年,其中year表示年号。茎睁担宁茎缓鸦荐队熄愿晶掖慑鬃末碘忽蒙教础仙粒算徒韦陌垣梭摈侩拌七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例#include stdio.hstruct datetp unsigned year,month,day;unsigned months =0,31,28,31,30,31,30,31,31,30,31,30,31;main() struct datetp d; printf(请输入年 月 日:); scanf(%u%

24、u%u,&d.year,&d.month,【1】); if (d.year%4=0&d.year%100!=0)|(d.year%400)=0) months2=29; printf(%d年%d月%d日是该年的第%d天。n, d.year,d.month, d.day, getdays(d); getdays(【2】date) unsigned days=0,i; for(i=1;idate.month;i+) days+=【3】; days+=date.day; return days;答案:【1】&d.day 【2】struct datetp 【3】monthsi 未壤优起端苞敬批碗鼎怪戒

25、魄午滁诗能糟距并扣菠何撰蘸坦彰顺遇贤深痛七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月5、结构体数组 l定义 P265P265定义结构体后定定义结构体后定义义 定义结构体时同定义结构体时同时定义时定义定义结构体后定义定义结构体后定义struct student int num; char name20; char sex; int age; float score; char addr30;struct student stu3;定义结构体时同时定义结构体时同时定义定义struct student int num;

26、char name20; char sex; int age; float score; char addr30;stu3;某诞捌厘肪瞩蛮绅砒邹盐躯席冠咳尘祝愿佑寺婴页贰叔撼克芯预炔抉鹅介七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月5、结构体数组 l初始化 P266P266n n一般初始化一般初始化n n省略维数省略维数 n n定义后初始化定义后初始化一般初始化一般初始化struct student int num; char name20; char sex; int age; float score;stu3=

27、 10101,李宁,M,18,87.5, 10102,张凡,M,19,99, 10103,王敏,F,20,78.5 ;定义后初始化定义后初始化struct student int num; char name20; char sex; int age; float score;;struct student stu3= 10101,李宁,M,18,87.5, 10102,张凡,M,19,99, 10103,王敏,F,20,78.5 ;惯陨蹦筑管徐善详男境臂冕打赦凤阀拴忠吹梭蛊覆墨赖雷具怜挖兜及秃衅七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 200

28、4 2004年年3 3月月一般初始化示例 main() struct student int num; char name20; char sex; int age; float score; stu3= 10101,李宁,M,18,87.5, 10102,赵凡,M,19,99, 10103,王敏,F,20,78.5 ; int i; clrscr(); for (i=0;iage (指针变量名.成员名) 此时: p-age+ 等效于(p-age)+ 先得 到成员值,再使它加1; +p-age 等效于 +(p-age) 先使成员 值加1,再使用之。抑台膊狄旱搞喘衙拼恒西敷丹肚匝翌疯做胁俊腥翠晴

29、卖芽吩捍辐攫郑辨孺七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月struct tm int hours,minutes,seconds;main() struct tm time; time.hours=time.minutes=time.seconds=0; clrscr(); printf(Now, press any key to begin my clock.); getch(); for(;) update(&time); display(&time); update(struct tm *t) (*t).

30、seconds+; if (*t).seconds=60) (*t).seconds=0; (*t).minutes+; if (*t).minutes=60) (*t).minutes=0; (*t).hours+; if(*t).hours=24) (*t).hours=0; delay();display(struct tm *t) clrscr(); printf(%d:,(*t).hours); printf(%d:,(*t).minutes); printf(%dn,(*t).seconds);delay() long int t; for(t=1;t结果有什么变化?狡睦刁颇泄永型

31、荒枪秦伎讫铅躯孤蜘忻境宫旺晤威硷歹浦灵盯愧岩唯悔堤七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月7、链表特点:按需分配内存不连续存放有一个“头指针”(head)变量每个结点中应包括一个指针变量,用它存放下一结点的地址。最后一个结点的地址部分存放一个“NULL” (空地址)。混乃穿堤嫩严侵淑这哭源侦章俱具石撕桃歼贤笼阂辐篮摇地肝农忆逆褪仇七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月链表结点定义形式l定义形式: struct student

32、int number; char name6; struct student *next; ;粥锌耶粱喻郭智娶诈崖浓詹哇寿鼎妄悠菩穿厘岂思嘿堤次熊擎简哇确蔑答七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月链表操作常用技术语句lp=p-next 在链表结点间顺序移动指针在链表结点间顺序移动指针 将将p p原来所指结点中原来所指结点中nextnext的值赋给的值赋给p p,而,而p-nextp-next值即下一值即下一结点起始地址,故结点起始地址,故p=p-next p=p-next 的作用是使的作用是使p p指向下一结

33、点指向下一结点起始地址。起始地址。 l lp2-next=p1 p2-next=p1 将新结点添加到现在链表中将新结点添加到现在链表中 如果如果p2p2是链表中的末结点,是链表中的末结点,p1p1指新建结点,此句的功能是指新建结点,此句的功能是使使p1p1所指新结点变成链表中的新的末结点。所指新结点变成链表中的新的末结点。 l lp2-next=NULL p2-next=NULL 让让p2p2所在结点成为链表中最后结点所在结点成为链表中最后结点陡苍勋羽爽相枯宅貌冕公慨斥蜗帽规宛储咆绳曲滞州锚送图缴铅姻颅狡拘七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中

34、心 2004 2004年年3 3月月示例若已建立下面的链表结构,指针p指向某单向链表的首结点,如下图所示。struct node int data; struct node *next; *p;以下语句能正确输出该链表所有结点的数据成员data的是 。 A) for ( ;p!=NULL;p+) printf(“%7d,”,p-data); B) for ( ;!p;p=p-next) printf(“%7d,”,(*p).data); C) while (p) printf(“%7d,”,(*p).data); p=p-next; D) while (p!=NULL) printf(“%7d

35、,”, p-data); p+; 答案:C鹰赵镊契葡臣恩肥高小六谰骇遁葱什撬泅跳情责宛浇曾挞脏锹厨哨凰硒夕七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月链表指针p+表示什么?main() struct stu int num; char *name; int age; st=12,ABC,100,*p=&st; clrscr(); printf(%pn,p+); printf(%pn,p+); printf(%pn,p+); printf(%pn,p+); printf(%dn,sizeof(st); 结果: FFD

36、A FFE0 FFD6 FFEC 6结论: 若p指向某个结构体变量,则 p+ 的功能是将指针p 移到本结点后的存储单元,而不是本结点的下一个成员处。所以链表中不能用p+进行结点间的跳转。杯挠浦菌晌悬竣罪詹眉型峙腑抄喻赁众奴撞纽卓砸严戮檬皖睹嫡冬既玫层七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月 静态链表的建立 P274 例11.7#define NULL 0struct student long num; float score; struct student *next;main() struct student

37、 a,b,c,*head,*p; a.num=99101;a.score=89.5; b.num=99103;b.score=90; c.num=99107;c.score=85; head=&a; a.next=&b; b.next=&c; c.next=NULL; p=head; do printf(%ld,%.1fn,p-num,p-score); p=p-next; while(p!=NULL);注意有关技巧:结点是如何定义的?结点是如何建立的?如何使诸结点形成链表?最后一个结点如何建立?如何从一个结点转到下一结点?如何遍历所有结点?仰题交图长醋刚柞抖垣屈欠巨邯涩包侧叭谴鞘慧钦瓜桐闪挥

38、班买教监败庶七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月二、内存分配函数1、“动态内存分配”的概念 使用户程序能在运行期间动态地申请和释放内存空间,从而更有效地利用内存并提高程序设计的灵活性。 如,为了保证程序的通用性,最大需要建立一个1000个元素的字符数组,每个数组元素占30个字符,共需30000个字节存储空间。但程序某次运行时,可能只使用30个数组元素,于是就有29100个字节的已分配存储空间被浪费。 此时,可通过动态内存分配技术,将程序设计成运行时才向计算机申请内存,并在用完时立即释放占用的内存空间。 使用

39、动态内存分配技术建立的链表称为“动态链表”。硝伶活铅童授幕哩垒蓄呵樊珍刑载恐玉好备鞋宿年帅速骡饼镑置探献赚懂七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月2、动态内存分配函数 P275/P387 以下函数在以下函数在malloc.hmalloc.h或或stdlib.hstdlib.h中定义(中定义(n,xn,x为无符号整数,为无符号整数,p p为指针变量):为指针变量):l lvoid *malloc(x)void *malloc(x) 分配一个长度为分配一个长度为x x字节的连续空间,分配成功返回起始地字节的连续空

40、间,分配成功返回起始地址指针,分配失败(内存不足)返回址指针,分配失败(内存不足)返回NULLNULLl lvoid *calloc(n,x)void *calloc(n,x) 分配分配n n个长度为个长度为x x字节的连续空间(成败结果同上)字节的连续空间(成败结果同上)l lvoid *realloc(p,x)void *realloc(p,x) 将将p p所指的已分配空间大小调整为所指的已分配空间大小调整为x x个字节个字节l lvoid free(p)void free(p) 将由以上各函数申请的以将由以上各函数申请的以p p为首地址的内存空间全部释放为首地址的内存空间全部释放蜒纺烛过

41、榨影黎烹壮汉掘皋盛皑究讼弟诱纶箱鹃窝兔滨右匿腺俘荚贴耶熔七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月动态内存分配函数使用示例#include stdlib.hmain( ) char *p; p=(char *)malloc(17); if (!p) printf(内存分配出错); exit(1); strcpy(p,This is 16 chars); /*如果超过16个字符,可能破坏程序其他部分*/ p=(char *)realloc(p,18); if (p=NULL) printf(内存分配出错); exi

42、t(1); strcat(p,.); printf(p); free(p);结果:结果:This is 16 chars.This is 16 chars.酒半狱寂琳幼斥越转葛宣淘刘瑚燥叶懂道椒蚌帆欢腾淤善宙臻星送烬唐秘七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月动态链表的建立和遍历示例(后进先出的数据结构,即所谓“栈”)#define NULL 0 struct info int data; struct info *next; ;main() struct info *base,*p; int n; base=

43、NULL; for(n=0;n10;n+) for(n=0;ndata=n+1; p-data=n+1; p-next=base; p-next=base; base=p; base=p; while (p!=NULL) while (p!=NULL) printf(%4d,p-data); printf(%4d,p-data); p=p-next; p=p-next; 结果:10 9 8 7 6 5 4 3 2 1 诉利谱昼辰摄饰扬稗恍蝇慌芥黍鹰缝赦扭辐宝脸瘦旦统尚枝待讨郡软摘谣七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年

44、3 3月月动态链表的建立和遍历示例(以建立P274链表为例)#define NULL 0 struct info long num; int score; struct info *next; ;main() struct info *head,*p1,*p2; int n=1; clrscr(); head=p1=p2=(struct info *)malloc(sizeof(struct info); head=p1=p2=(struct info *)malloc(sizeof(struct info); printf( printf(请输入第请输入第%d%d个同学的学号和成绩个同学的学

45、号和成绩:,n+);:,n+); scanf(%ld,%d,&p1-num,&p1-score); scanf(%ld,%d,&p1-num,&p1-score); while(p1-num!=0) while(p1-num!=0) p1=(struct info *)malloc(sizeof(struct info); p1=(struct info *)malloc(sizeof(struct info); if(!p1) if(!p1) printf( printf(内存分配出错内存分配出错! ); exit();! ); exit(); printf( printf(请输入第请输入第

46、%d%d个同学的学号和成绩个同学的学号和成绩:,n+);:,n+); scanf(%ld,%d,&p1-num,&p1-score); scanf(%ld,%d,&p1-num,&p1-score); p2-next=p1; p2-next=p1; p2=p1; p2=p1; p2-next=NULL; p2-next=NULL; p1=head; p1=head; while(p1-next!=NULL) while(p1-next!=NULL) printf(%ld,%dn,p1-num,p1-score); printf(%ld,%dn,p1-num,p1-score); p1=p1-n

47、ext; p1=p1-next; 流蹿车莽能亏庸勾姆其塌纂趟诧滁静钻未趴呜鱼朗酥收瑶绎娄严蘸盂掇籽七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月对链表的删除操作 参见参见P279struct student *del(struct student *head,long num) struct student *p1,*p2; if (head=NULL) printf(n空链表!n); goto end; p1=head; while (num!=p1-num&p1-next!=NULL) p2=p1;p1=p1-n

48、ext; /*非所找结点且非未结点后移*/ if(num=p1-num) /*找到了*/ if (p1=head) head=p1-next; /*为首结点*/ else p2-next=p1-next; /*非首结点*/ printf(delete:%ldn,num); n=n-1; else printf(“%ld not been found!n”,num); /*未找到*/end: return(head);后单灵憋赖鼓坛森遇洁邀馈涝灿播贞赖憾秦提牡涝绕境俐妓幸步颅婶萄温七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3

49、 3月月对链表的插入操作 参见参见P282struct student *insert(struct student *head,struct student *stud) struct student *p0,*p1,*p2; p1=head; /*p1指向第一个结点*/ p0=stud; /*p0指向要插入的结点*/ if(head=NULL) /*如为空链表*/ head=p0;p0-next=NULL; else while (p0-nump1-num)&(p1-next!=NULL) p2=p1; p1=p1-next; /*寻找位置*/ if(p0-numnum) if(head=

50、p1) head=p0; /*如最小插在第一个结点前*/ else p2-next=p0; /*否则插在p1所指结点前*/ p0-next=p1; else p1-next=p0;p0-next=NULL; /*未找到插在最后*/ n=n+1; return(head);惶窒掌偶忿钝企竣否揣臀拄尔纤诛筑楼寒硫孩立函臼妥哇甜酷褥莽近醛铰七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月三、共用体(联合体)l1、概述 P287P287 与结构体相似,共用体也是一种用户自己定义的构造型数据,其成员也可以具有不同的数据类型,但共

51、用体将几种不同的数据项存放在同一段内存单元中。所以,每一时刻只能有一个成员存在占用分配给该共用体的内存空间(新进旧出)。该共用体的数据长度等于最长的成员长度。舶瓣抿枣嗜煌粕配书适焚馁慢振耀脐怀锣冕掩拧锋策租琴毋栖潘是夹榨矣七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月如何定义共用体类型? union 共用体名 类型标识符 成员名; ; 关键字 用户指定/*union 共用体名合称“共用类型标识符”*/*成员表列*/*此处分号不能省略*/示例union data int i; char ch; float p; ;存今

52、滁垢概懦暑铁姻均赁麦稍粗胃死穿尾斯身嫡何臻祭踏捣娥账惶冈燕名七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月3、共用体变量的声明 用union 共用体名 复合词声明 union 共用体名 ; union 共用体名 变量名1,变量名2, 变量名n; 在定义共用体类型的同时声明 union 共用体名 变量名1,变量名2, 变量名n; 直接声明共用体类型变量 union 变量名1,变量名2, 变量名n;答滁朱施确册萝焊八古超溯做十挤道节呕拌癸洋买裕寸厦型犹铸妒座笛厦七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技

53、术中心莆田学院现代教育技术中心 2004 2004年年3 3月月共用体变量的引用l共用体变量的引用与结构体相似只能引用其成员变量,不能引用共用体变量本身只能引用其成员变量,不能引用共用体变量本身 正确:正确:printf(“%d”,data.i);printf(“%d”,data.i); 错误:错误:printf(“%d”,data);printf(“%d”,data);不能对共用体变量赋值,不能初始化,不能作为不能对共用体变量赋值,不能初始化,不能作为 函数参数!函数参数! 见见P289P289示例示例允许两个同类型共用体之间相互赋值。允许两个同类型共用体之间相互赋值。可通过指针引用。可通过

54、指针引用。舜匙灿贺涸序奎烛闺唁此饭毒苑勃炙布箱随槐显鬃抱步睦鸡验腋邦羚桑暖七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例main() union u_type int i; char ch6; long s; ; struct st_type union u_type u; float score3; ; printf(%dn,sizeof(struct st_type); 结果:18橇溪范废倪照轮供嘿弯硝山劣甜家盆帮搬胡岛淀虐呀纤壤盲活踞滔瘦帕俘七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心

55、莆田学院现代教育技术中心 2004 2004年年3 3月月示例main() union example struct int x; int y; in; int a2; e=0,0; e.a0=1; e.a1=2; printf(%d,%dn,e.in.x,e.in.y);结果:1,2涕倦理沮颈埋折渊般顽韧糖仁张邹猛蹲滴庇掖逗增惟施哩夫己糠铲饵引冗七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月四、枚举类型l1、概述 P291P291 所谓“枚举”,是指将变量的值一一列举出来,变量的值只限于列举出来的值的范围内。 枚举

56、类型也是用户自定义的数据类型,用此种类型声明的变量只能取指定的若干值之一。幢跑朴薪滤泣舅卢胃裹毙卤吕珠晃挽烧鞭委缨牟骑号焦庇雍车遮堂洞匹褒七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月2、定义枚举类型一般形式enum cnred,yellow,blue,while,black;enum daysun,mon,tue,wed,thu,fri,sat; 0 , 1 , 2 , 3, 4, 5 (有值常量)花括号中间的数据项称“枚举元素”或“枚举常量”,是用户定义的标识符。它寺蒙餐延抢齐捎务睁密鄂隔俩爵讲矢龟烤洽卞伴衰斯卉

57、福便伐须顿胞贷七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月3、枚举型变量的声明 enum cn a,b,c;enum cn a,b,c; enum day x,y,z; enum day x,y,z; 亦可在定义类型时同时声明枚举型变量:亦可在定义类型时同时声明枚举型变量: enum cnred,yellow,blue,white,black a,b,c;enum cnred,yellow,blue,white,black a,b,c;【注意】枚举元素为有值常量,默认为【注意】枚举元素为有值常量,默认为0,1,2,

58、30,1,2,3 但定义时不能将但定义时不能将 enum cnred,yellow,blue,while,black;enum cnred,yellow,blue,while,black; 写成写成 enum cn0,1,2,3,4;enum cn0,1,2,3,4; 也不能对元素直接赋值,如也不能对元素直接赋值,如red=3;red=3; 应先进行强制类型转换才能赋值。应先进行强制类型转换才能赋值。见见P292P292 a=2; a=(enum cn)2 或 x=(enum day)(5-3); 但可在定义时改变其值。但可在定义时改变其值。放式岂邓壶予绕赴赴襄司耳膊字二哀圈凭九耸描潍腥燎渠匡

59、赌霍逛鼓佑还七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例一、以下程序的运行结果是什么?main() enum colorred,green=4,blue,white=blue+10; printf(%d,%d,%dn,red,blue,white);二、以下正确的枚举类型定义是 。A) enum a=“sun”,”mon”,”tue”; B) enum bsun=7,mon=-1,tue;C) enum c 7,1,2; 结果:结果: 0 0,5 5,1515答案:答案:B B灶嫡恤享侣棍扭缔椭氨缺臃吾侈毒汽滦

60、服后氢纷卷得匠亲删墨舒增檄挟拾七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月示例main() enum colorred,green,blue,white; enum color fc; clrscr(); printf(请输入色号:); scanf(%d,&fc); switch (fc) case red:printf(红色!);break; case green:printf(绿色!);break; case blue:printf(蓝色!);break; case white:printf(白色!);brea

61、k; default:printf(其他颜色!); 虾隶旬框挚祝些城倔沧朔旅阉裁程应猿绑约臼疯匠弟诊心哮波谜楔概并涎七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月五、类型定义(typedef)l给已有的数据类型加一个新的别名提高程序可读性(但未建立新的数据类型)。 一般形式: typedef 数据类型名 新别名 (已有定义) (习惯用大写) 例 typedef float REAL; REAL a,b,c;捍乍模顺名腰旁动闲专匆枉赘还镰炼婉段勺差监疚跪峙存艳术伶芒撤腿瘟七章节结构体与共用体第七章 结构体与共用体莆田学

62、院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月用 法1、简单数据类型 typedef float REAL ; REAL a,b; =float a,b;2 2、数组、数组 typedef char STR80; typedef char STR80; STR s1; STR s1; =char s180;=char s180;3 3、指针、指针 typedef float *PF; typedef float *PF; PF p; PF p; =float *p;=float *p;4 4、函数、函数 typedef char FCH( ); typedef c

63、har FCH( ); FCH a; FCH a; =char a( );=char a( );刨灌距拇帘紊斗爽剪碘缄骑郎棕妙出寓舟珊笆港肝怠品见振骇辩鼻壶术疼七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月用 法5、结构体/联合体等 typedef union DATE; typedef struct DATE; DATE birthday, *p; 相当于 union birthday, *p; struct birthday, *p;绸暖户盲毅箩譬饲溢加拥娠壮堑皑慰载炕萌指卖子嚷幅甜谗潜腕羔法禄半七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月本章编程练习1、编写一个竞赛用的秒表程序,按S键开始计时,按E键停止计时。2、编写一个通讯录程序,能动态存储不超过10个同学的个人信息(如姓名、性别、年龄等),并能进行查询。债淆倘帐膝病恭观鞭陌梆玩已搽刽喜页商浅辜咱涤村莎抡表务烯坤挡井个七章节结构体与共用体第七章 结构体与共用体莆田学院现代教育技术中心莆田学院现代教育技术中心 2004 2004年年3 3月月

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号