c语言程序设计现代方法ch结构联合和枚举.ppt

上传人:b****1 文档编号:1389662 上传时间:2022-10-21 格式:PPT 页数:102 大小:730KB
下载 相关 举报
c语言程序设计现代方法ch结构联合和枚举.ppt_第1页
第1页 / 共102页
c语言程序设计现代方法ch结构联合和枚举.ppt_第2页
第2页 / 共102页
c语言程序设计现代方法ch结构联合和枚举.ppt_第3页
第3页 / 共102页
c语言程序设计现代方法ch结构联合和枚举.ppt_第4页
第4页 / 共102页
c语言程序设计现代方法ch结构联合和枚举.ppt_第5页
第5页 / 共102页
点击查看更多>>
下载资源
资源描述

c语言程序设计现代方法ch结构联合和枚举.ppt

《c语言程序设计现代方法ch结构联合和枚举.ppt》由会员分享,可在线阅读,更多相关《c语言程序设计现代方法ch结构联合和枚举.ppt(102页珍藏版)》请在冰豆网上搜索。

c语言程序设计现代方法ch结构联合和枚举.ppt

Copyright2008W.W.Norton&Company.Allrightsreserved.,1,第16章,结构,联合和枚举,结构变量,结构的性质与数组不同.结构的成员不必具有相同的类型.结构的成员有名字;我们可以指定名字而不是位置去选择一个指定的成员.在一些语言中,结构也称为记录,成员也称为域.,Copyright2008W.W.Norton&Company.Allrightsreserved.,2,声明结构变量,结构是存储相关数据的逻辑选择.存储仓库里零部件的两个结构变量的声明:

structintnumber;charnameNAME_LEN+1;inton_hand;part1,part2;,Copyright2008W.W.Norton&Company.Allrightsreserved.,3,声明结构变量,结构的成员按声明时的顺序存储在内存中.part1的外观假设:

part1在地址2000.整数占4字节.NAME_LEN的值是25.成员之间没有空隙.,4,声明结构变量,结构的抽象表示:

成员的值将放在框里.,Copyright2008W.W.Norton&Company.Allrightsreserved.,5,声明结构变量,每个结构代表一个新的范围.这个范围里的任何名字不会与程序中的其他名字冲突.在C术语中,每个结构对它的成员有个单独的名字空间.,Copyright2008W.W.Norton&Company.Allrightsreserved.,6,声明结构变量,例如,下面的声明可以出现在同一个程序中:

structintnumber;charnameNAME_LEN+1;inton_hand;part1,part2;structcharnameNAME_LEN+1;intnumber;charsex;employee1,employee2;,Copyright2008W.W.Norton&Company.Allrightsreserved.,7,初始化结构变量,结构声明可以包含初始化:

structintnumber;charnameNAME_LEN+1;inton_hand;part1=528,Diskdrive,10,part2=914,Printercable,5;初始化之后的part1:

Copyright2008W.W.Norton&Company.Allrightsreserved.,8,初始化结构变量,结构初始化的规则与数组相似.用于初始化的表达式必须是常量.(在C99中,这个限制被放松.)初始化的成员数可以比结构的成员数少.任何被剩下的成员的初始值为0.,Copyright2008W.W.Norton&Company.Allrightsreserved.,9,指派初始化(C99),C99的指派初始化可以用于结构.对前面的例子中的part1的初始化:

528,Diskdrive,10在指派初始化中,每个值被标记为成员名:

.number=528,.name=Diskdrive,.on_hand=10句点和成员名一起被称为指派前缀.,Copyright2008W.W.Norton&Company.Allrightsreserved.,10,指派初始化(C99),指派初始化容易阅读和检查.指派初始化的值不必与结构成员具有相同的顺序.程序员不必记住结构成员在最初声明时的顺序.成员的顺序可以改变而不影响指派初始化.,Copyright2008W.W.Norton&Company.Allrightsreserved.,11,指派初始化(C99),在指派初始化中,并非所有的值需要指派前缀.例如:

.number=528,Diskdrive,.on_hand=10编译器认为“Diskdrive”初始化结构中number后的成员.初始化没有说明的成员的值默认为0.,Copyright2008W.W.Norton&Company.Allrightsreserved.,12,对结构的操作,要访问结构里的成员,我们首先写出结构名,然后句点,再后成员名.显示part1的成员值的语句:

printf(Partnumber:

%dn,part1.number);printf(Partname:

%sn,part1.name);printf(Quantityonhand:

%dn,part1.on_hand);,Copyright2008W.W.Norton&Company.Allrightsreserved.,13,对结构的操作,结构成员可以出现在赋值表达式的左边或者作为增减表达式的操作数:

part1.number=258;/*changespart1spartnumber*/part1.on_hand+;/*incrementspart1squantityonhand*/,Copyright2008W.W.Norton&Company.Allrightsreserved.,14,对结构的操作,用于访问结构成员的句点实际上是C语言运算符.它的优先级高于所有的其他运算符.例如:

scanf(%d,.运算符的优先级高于&,因此&计算part1.on_hand的地址.,Copyright2008W.W.Norton&Company.Allrightsreserved.,15,对结构的操作,另一个主要的结构操作是赋值:

part2=part1;这条语句的效果是拷贝part1.number到part2.number,part1.name到part2.name,等等.,Copyright2008W.W.Norton&Company.Allrightsreserved.,16,对结构的操作,数组不能使用=拷贝,但是当结构拷贝时,嵌入到结构中的数组可以拷贝.一些程序员利用这种特性创建假结构去封装将要拷贝的数组:

structinta10;a1,a2;a1=a2;/*legal,sincea1anda2arestructures*/,Copyright2008W.W.Norton&Company.Allrightsreserved.,17,对结构的操作,=运算符只能用于兼容类型的结构.同时声明的两个结构(如part1和part2)是兼容的.使用相同的结构标签或类型名声明的结构也是兼容的.除了赋值,C不提供对整个结构的操作.特别地,=和!

=运算符不能用于结构.,Copyright2008W.W.Norton&Company.Allrightsreserved.,18,结构类型,假设程序需要声明几个具有相同成员的结构变量.我们需要一个表示结构类型的名字,不是一个特定的结构变量.命名结构的方法:

声明一个结构标签使用typedef定义一个类型名,Copyright2008W.W.Norton&Company.Allrightsreserved.,19,声明一个结构标签,结构标签用于确定一种特定类型的结构.一个名为part的结构标签的声明:

structpartintnumber;charnameNAME_LEN+1;inton_hand;注意右括号的后面必须有分号.,Copyright2008W.W.Norton&Company.Allrightsreserved.,20,声明一个结构标签,part标签能够用于声明变量:

structpartpart1,part2;我们不能丢掉struct关键字:

partpart1,part2;/*WRONG*/part不是类型名;没有struct,它没有意义.既然结构标签不能被识别,除非前面有struct,它们与程序中的其他名字不冲突.,Copyright2008W.W.Norton&Company.Allrightsreserved.,21,声明一个结构标签,结构标签的声明与结构变量的声明可以合起来:

structpartintnumber;charnameNAME_LEN+1;inton_hand;part1,part2;,Copyright2008W.W.Norton&Company.Allrightsreserved.,22,声明一个结构标签,所有的声明为具有structpart类型的结构是兼容的:

structpartpart1=528,Diskdrive,10;structpartpart2;part2=part1;/*legal;bothpartshavethesametype*/,Copyright2008W.W.Norton&Company.Allrightsreserved.,23,声明一个结构标签,声明结构标签的另一个选择是,我们可以使用typedef定义一个真正的类型名.一个名为Part的类型的定义:

typedefstructintnumber;charnameNAME_LEN+1;inton_hand;Part;Part可以像内置类型一样使用:

Partpart1,part2;,Copyright2008W.W.Norton&Company.Allrightsreserved.,24,声明一个结构标签,当需要命名一个结构时,我们既可以声明结构标签,也可以使用typedef.然而,当结构用于链表时,声明结构标签是必须的(见第17章).,Copyright2008W.W.Norton&Company.Allrightsreserved.,25,结构作为自变量和返回值,函数可以将结构作为自变量和返回值.一个带结构自变量的函数:

voidprint_part(structpartp)printf(Partnumber:

%dn,p.number);printf(Partname:

%sn,p.name);printf(Quantityonhand:

%dn,p.on_hand);Acallofprint_part:

print_part(part1);,Copyright2008W.W.Norton&Company.Allrightsreserved.,26,结构作为自变量和返回值,一个返回part结构的函数:

structpartbuild_part(intnumber,constchar*name,inton_hand)structpartp;p.number=number;strcpy(p.name,name);p.on_hand=on_hand;returnp;Acallofbuild_part:

part1=build_part(528,Diskdrive,10);,Copyright2008W.W.Norton&Company.Allrightsreserved.,27,结构作为自变量和返回值,传递一个结构给函数和从函数返回一个结构,都需要拷贝结构中的所有成员.为避免这种开销,有时传递和返回结构指针是可取的.第17章给出结构指针作为自变量和返回值的例子.,Copyright2008W.W.Norton&Company.Allrightsreserved.,28,结构作为自变量和返回值,避免结构拷贝还有其他原因.例如,头文件定义了一个名为FILE的类型,它是一个典型的结构.每一个FILE结构存储一个打开文件的状态信息,因而在程序中必须是唯一的.中的每一个打开文件的函数都返回一个指向FILE结构的指针.每一个对打开文件进行操作的函数都需要一个FILE指针作为自变量.,Copyright2008W.W.Norton&Company.Allrightsreserved.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > IT认证

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1