(续)结构体等构造数据类型.ppt

上传人:cn****1 文档编号:567919037 上传时间:2024-07-22 格式:PPT 页数:54 大小:748.31KB
返回 下载 相关 举报
(续)结构体等构造数据类型.ppt_第1页
第1页 / 共54页
(续)结构体等构造数据类型.ppt_第2页
第2页 / 共54页
(续)结构体等构造数据类型.ppt_第3页
第3页 / 共54页
(续)结构体等构造数据类型.ppt_第4页
第4页 / 共54页
(续)结构体等构造数据类型.ppt_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《(续)结构体等构造数据类型.ppt》由会员分享,可在线阅读,更多相关《(续)结构体等构造数据类型.ppt(54页珍藏版)》请在金锄头文库上搜索。

1、 第六章第六章第六章第六章 结构体等构造数据类型结构体等构造数据类型结构体等构造数据类型结构体等构造数据类型第第6章章 结构体等构造数据类型结构体等构造数据类型6.1 6.1 结构体结构体6.2 6.2 共用体共用体6.3 6.3 枚举型枚举型6.4 6.4 TypedefTypedef的用途的用途C的数据类型:的数据类型:整型整型int基本数据类型基本数据类型浮点型浮点型floatdouble字符型字符型char数组数组以以为标志为标志结构结构struct构造类型构造类型复杂数据类型复杂数据类型联合联合union枚举枚举enum指针类型指针类型以以*为标志为标志空类型空类型 结结构构体体类类

2、型型的的数数据据由由若若干干个个变变量量组组成成,每每一一个个变变量量既既可可以以是是一一个个基基本本数数据据类类型型的的数据,也可以是另一个构造类型的数据。数据,也可以是另一个构造类型的数据。结结构构体体实实际际上上是是C编编译译没没有有提提供供的的数数据据类类型。型。6.1结构体结构体结构体的说明结构体的说明一般格式:一般格式:struct结构体名结构体名类型名类型名1结构体成员名表结构体成员名表1;类型名类型名2结构体成员名表结构体成员名表2;。类型名类型名n结构体成员名表结构体成员名表n;例例:要要先先定定义义一一个个结结构构体体类类型型:time。time是是时时间间,当当然然可可以

3、以用用三三个个整整型型变变量量来来表表示示一一个时间,个时间,inthour;intminute;intsecond;但是不能表示三个变量之间的逻辑关系。但是不能表示三个变量之间的逻辑关系。若若把把时时间间说说明明为为TIME,而而TIME含含有有小小时时、分分、秒秒三三个个成成分分,则则TIME的的结结构构体体说说明是:明是:structTIMEinthour;intminute;intsecond;其其中中struct是是关关键键字字,TIME是是结结构构体体的的类类型型名名,它它实实际际上上规规定定了了一一种种新新的的复复杂杂数数据类型。据类型。在在随随后后的的程程序序中中就就可可以以使

4、使用用TIME定定义义结结构体变量了。例:构体变量了。例:structTIMEmeeting_begin;结构体类型变量的定义结构体类型变量的定义结构体变量定义有三种方法:结构体变量定义有三种方法:方法一:方法一:先说明结构体,再定义结构体先说明结构体,再定义结构体变量。例:变量。例:structpointintx;inty;structpointp1,p2;方法二:方法二:在说明结构体类型的同时定义结构体变量。在说明结构体类型的同时定义结构体变量。例如:例如:structTIMEinthour;intminute;intsecond;meeting_begin,meeting_end; 这种

5、方法的语法格式是:这种方法的语法格式是:struct结构体名结构体名类型名类型名1结构体成员名表结构体成员名表1;类型名类型名2结构体成员名表结构体成员名表2;。类型名类型名n结构体成员名表结构体成员名表n;结构体变量表;结构体变量表;方方法法三三:是是在在说说明明结结构构体体时时直直接接定定义义结结构构体体变变量,并且不用指定结构体名。量,并且不用指定结构体名。structinthour;intminute;intsecond;meeting_begin,meeting_end; 这种方法的语法格式是:这种方法的语法格式是:struct类型名类型名1结构体成员名表结构体成员名表1;类型名类型

6、名2结构体成员名表结构体成员名表2;。类型名类型名n结构体成员名表结构体成员名表n;结构体变量表;结构体变量表;结构体成员的引用结构体成员的引用C语语言言中中对对结结构构体体变变量量的的使使用用是是通通过过对对其其成成员员的的引引用用来来实实现现的的。一一般般不不能能对对结结构构体体变变量量进进行整体的引用。行整体的引用。引用的方法:引用的方法:结构体变量名结构体变量名.成员名成员名符符号号“.”是是依依据据结结构构体体变变量量名名存存取取结结构构体体成员的运算符。成员的运算符。#includestdio.hvoidmain()structTIMEinthour;intminute;intse

7、cond;structTIMEmt_begin;例:用符号例:用符号“.”引用结构体变量的成员。引用结构体变量的成员。mt_begin.hour=8;mt_begin.minute=30;mt_begin.second=00;printf(nmeetingtimeis%2d:%2d:%2d,mt_begin.hour,mt_begin.minute,mt_begin.second);运行结果: meetingtimeis8:30:00结构体的初始化结构体的初始化对对结结构构体体变变量量的的初初始始化化与与对对数数组组的的初初始始化化相相似似,因因为为存存储储分分配配时时,通通常常按按照照各各成

8、成员员在在结结构体中出现的先后顺序连续排列。构体中出现的先后顺序连续排列。structTIMEaudit_begin=8,30,0;如如果果初初始始化化数数值值的的个个数数小小于于结结构构体体成成员员的的个个数,系统会自动将其它成员初始化为数,系统会自动将其它成员初始化为0。#includestdio.hvoidmain()structTIMEinthour;intminute;intsecond;structTIMEmeeting_begin=8,30,00;例:结构体变量的初始化例:结构体变量的初始化printf(nauditiontimeis%2d:%2d:%2d,audit_begin

9、.hour,audit_begin.minute,audit_begin.second);运行结果: meetingtimeis8:30:00structstudent_typelongintnum;/*学号学号*/structdate_typeintmonth;intday;intyear;birthday;/*出生日期出生日期*/stu;可可以以使使用用scanf(“%d”,&stu.birthday.day)输入入数数据。据。但是不能引用但是不能引用stu.birthday。结构体的嵌套结构体的嵌套 注意,注意,对嵌套结构体的引对嵌套结构体的引用必须引用到最末一级。用必须引用到最末一级。

10、注:结构体类型和结构变量注:结构体类型和结构变量结构体类型和结构体变量是不同概念。先结构体类型和结构体变量是不同概念。先定义结构类型,再定义结构变量。定义结构类型,再定义结构变量。定义结构类型后,不会为其分配内存空间。定义结构类型后,不会为其分配内存空间。只有当变量被说明,才会为其分配存储空只有当变量被说明,才会为其分配存储空间。间。结构类型不能进行运算、赋值,而结构变结构类型不能进行运算、赋值,而结构变量可以。量可以。结构体中包含数组structstudent_typelongintnum;/*学号学号*/charname10;/*姓名姓名*/structdate_typeintmonth;

11、intday;intyear;birthday;/*出生日期出生日期*/stu;例例:结构体中包含数构体中包含数组。#includestdio.hvoidmain()inti;structSTOCKcharstockname16;/*股票名称股票名称*/charstockcode7;/*股票代码股票代码*/floatprice3;/*买入价、卖出价、成交价买入价、卖出价、成交价*/;StructSTOCKsfz=ShenFaZhan,000001,8.77,8.78,8.78;/*用深发展的数据初始化结构体变量用深发展的数据初始化结构体变量sfz*/printf(n%s%s,sfz.stock

12、name,sfz.stockcode);/*输出股票名称和股票代出股票名称和股票代码*/for(i=0;i3;i+)/*输出股票的出股票的买入价、入价、卖出价和成交价出价和成交价*/printf(%6.2f,sfz.pricei);结构体数组定义结构体数组的语法:定义结构体数组的语法:struct结构体名结构体名数组名数组名长度长度;访访问问结结构构体体数数组组中中的的结结构构体体成成员的方法是:员的方法是:数组名数组名下标下标.成员名成员名6.2 公用体公用体又称为联合体。公用体又称为联合体。在在编编制制一一些些比比较较高高级级的的程程序序时时,有有时时需需要要把把不同类型的变量放在同一存储

13、区域内。不同类型的变量放在同一存储区域内。一一个个变变量量x,它它既既可可以以用用来来存存储储一一个个单单字字符符还还可可以以存存储储一一个个浮浮点点数数或或是是一一个个整整数数,当当然然,在在一一个个时时间间点点,它它只只能能存存放放其其中中的的一一种种数数据据,新新的的数数据据覆覆盖盖老老的的数数据据,新新的的数数据据是是什什么么数数据据类类型型,x变量就是什么数据类型。变量就是什么数据类型。一般格式:一般格式:union公用体名公用体名类型名类型名1公用体成员名表公用体成员名表1;类型名类型名2公用体成员名表公用体成员名表2;。类型名类型名n公用体成员名表公用体成员名表n;公用体变量名表

14、公用体变量名表;共用体的说明共用体的说明例如,例如,unionmixedcharc;floatf;inti;注注:mixed为为公公用用体体名名,与与说说明明结结构构体体一一样样,说说明明一一个个公公用用体体,只只是是说说明明了了一一种种新新的的数数据据类型,并不引起内存的分配。类型,并不引起内存的分配。联合体变量的定义联合体变量的定义联合体变量的定义方法也有三种:联合体变量的定义方法也有三种:先说明联合体,再定义联合体变量先说明联合体,再定义联合体变量在说明联合体类型的同时定义联合体变量在说明联合体类型的同时定义联合体变量直接定义联合体变量。直接定义联合体变量。unionmixedcharc

15、;floatf;inti;unionmixedx;union char c; float f; int i; x;union mixed char c; float f; int i x;与结构体变量不同的是,公用体与结构体变量不同的是,公用体变量在内存中所占的字节数是成员表变量在内存中所占的字节数是成员表中最大的,而不象结构体变量是所有中最大的,而不象结构体变量是所有成员所占字节数的总和。成员所占字节数的总和。unionmixedx=a;这时,系统按成员这时,系统按成员c对第一个字对第一个字节赋值,其余单元的值为节赋值,其余单元的值为0。在定义时共用体的初始化在定义时共用体的初始化对对于于公

16、公用用体体变变量量成成员员的的直直接接引引用用是使用运算符是使用运算符“.”,语法是:,语法是:公用体变量名公用体变量名.成员名。成员名。例例如如x.f,可可以以将将x.f看看成成一一个个普普通的浮点型数据进行存取。通的浮点型数据进行存取。共用体的引用共用体的引用注:注: 不能对联合体变量不能对联合体变量x直接存取内容。直接存取内容。如如:x=15.00是是错错误误的的,只只能能对对x的的三三个个成成员员进进行行操操作作,这这三三个个成成员员是是x.f、x.i和和x.c,并并且且这三个联合体成员不可能同时存在。这三个联合体成员不可能同时存在。例例:在在下下面面的的程程序序中中,执执行行语语句句

17、x.i=10;以以后后x.f的的值是不能够确定的。值是不能够确定的。#includestdio.hunionmixedcharc;floatf;inti;voidmain()unionmixedx;x.i=10;printf(%f,x.f);/*x.f的值不确定的值不确定*/练习1、定义一个包括年、月、日的结构体变量,将其转换成这年中的第几天输入。(不考虑闰年,2月为28天)2、利用结构体编写程序,实现输入三个学生的学号,姓名,数学成绩,将他们按成绩的高低进行排列,并输出structdate_typeintmonth;intday;intyear;date;main()inti,j=0;sca

18、nf(%d%d,&date.month,&date.day);for(i=1;idate.month;i+)switch(i)case4:case6:case9:case11:j=j+30;break;case2:j=j+28;break;default:j=j+31;j=j+date.day;printf(todayisthe%dthdayoftheyear,j);题题16.3枚举枚举 使用枚举变量的主要目的是提高使用枚举变量的主要目的是提高程序的可读性,所谓程序的可读性,所谓“枚举枚举”就是把所就是把所有可能的取值情况列举出来。例如,有可能的取值情况列举出来。例如,真和假表示了逻辑值的两种

19、情况,男真和假表示了逻辑值的两种情况,男和女是性别的两种取值,选修课成绩和女是性别的两种取值,选修课成绩有有“优优”、“良良”、“中中”、“及及格格”和和“不及格不及格”五种取值。五种取值。枚举的说明和枚举变量的定义枚举的说明和枚举变量的定义枚举的说明格式为:枚举的说明格式为:enum枚举名枚举名枚举元素表(逗号分隔)枚举元素表(逗号分隔);enumcolorred,green,blue,yellow,white;enumboolfalse,true;枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也

20、就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。枚枚举举变变量量的的定定义义与与结结构构体体相相类类似似,也也有有三三种:种:(1)与枚举说明分开定义与枚举说明分开定义enum枚举名枚举名变量名表;变量名表;例如:例如:enumcolorred,green,blue,yellow,white;enumcolorselect,change;select和和change

21、是枚举变量。是枚举变量。(2)与枚举说明一起定义与枚举说明一起定义例如:例如:enumcolorred,green,blue,yellow,whiteselect,change;(3)不说明枚举名,直接定义枚举变量不说明枚举名,直接定义枚举变量例如:例如:enumred,green,blue,yellow,whiteselect,change;枚举变量的使用枚举变量的使用枚举变量的使用与结构体变量枚举变量的使用与结构体变量完全不同。完全不同。如果一个变量被定义为是一个如果一个变量被定义为是一个枚举变量,则它的取值只能取自对枚举变量,则它的取值只能取自对应的枚举元素,而不能是其它任何应的枚举元素

22、,而不能是其它任何数。数。如果有定义如果有定义enumred,green,blue,yellow,whiteselect,change;则则select=red;和和change=white;都是正确的,而都是正确的,而select=red_white是是错误的,因为错误的,因为red_white并没有在并没有在枚举元素表中出现。枚举元素表中出现。枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例

23、如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。C编译对枚举元素作为常整数处编译对枚举元素作为常整数处理,遇到枚举元素时,编译程序把理,遇到枚举元素时,编译程序把其中第一个枚举元素赋值为其中第一个枚举元素赋值为0,第,第2个赋值为个赋值为1,所以,所以select=red;和和change=white;两句赋值语句执行以两句赋值语句执行以后后,select的的值值为为0,change的的值值为为4。C语言允许程序员将某些枚举元素语言允许程序员将某些枚举元素强制赋值,指定

24、为一整数常量,被强制强制赋值,指定为一整数常量,被强制赋值的枚举元素后面的值按顺序逐个增赋值的枚举元素后面的值按顺序逐个增1。enumcolorred,green,blue=5,yellow,white/*实际值为实际值为0,1,5,6,7*/;枚举元素是常量,有固定的数值,枚举元素是常量,有固定的数值,按枚举的顺序分别是整数按枚举的顺序分别是整数0、1、2,不,不能将其当作变量使用,也就是说不能在能将其当作变量使用,也就是说不能在赋值号的左边使用枚举元素。赋值号的左边使用枚举元素。例如,例如,true=1;是错误的。是错误的。注意,注意,不能有两个相同名字的枚举元素,不能有两个相同名字的枚举

25、元素,枚举元素也不能与其它的变量同名。枚举元素也不能与其它的变量同名。使用枚举类型时,不提倡将整型值使用枚举类型时,不提倡将整型值与枚举元素直接联系起来,只要简单地与枚举元素直接联系起来,只要简单地把这些变量看成具有某种特点的枚举类把这些变量看成具有某种特点的枚举类型的变量。型的变量。enumboolfalse,trueflag;if(flag=false)6.4类型定义类型定义使用类型定义的目的是简化结使用类型定义的目的是简化结构体和联合体等构造类型的类型说明,构体和联合体等构造类型的类型说明,同时可以增强可读性。同时可以增强可读性。类型定义的一般格式是:类型定义的一般格式是:typedef

26、原类型名原类型名新类型名;新类型名;功能:将原类型名表示的数据类功能:将原类型名表示的数据类型用新类型名代替。型用新类型名代替。typedefintCOUNTER;现在现在COUNTER是是int的另一个的另一个名字,那么,使用名字,那么,使用COUNTERi,j,k;定义变量定义变量i、j和和k以后,它们实际上以后,它们实际上都是整型数,用都是整型数,用COUNTER定义可定义可以明确地表示这几个变量是做计数以明确地表示这几个变量是做计数器的。器的。typedefcharSTRING81;STRINGtext,input_line;text和和input_line是包含是包含81个字符个字符

27、的数组。的数组。typedefchar*STRING_PTR;STRING_PTRbuffer;buffer为指向字符的指针。为指向字符的指针。typedefstructtimeinthour;intminute;intsecond;TIME;TIME可以直接作为一种新的数据可以直接作为一种新的数据类型说明符,而不必再使用关键字类型说明符,而不必再使用关键字struct了了。TIMEbirth;birth变量的数据类型是变量的数据类型是time结构体类型。结构体类型。typedefintCOUNTER;现在现在COUNTER是是int的另一个的另一个名字,那么,使用名字,那么,使用COUNTE

28、Ri,j,k;定义变量定义变量i、j和和k以后,它们实际上以后,它们实际上都是整型数,用都是整型数,用COUNTER定义可定义可以明确地表示这几个变量是做计数以明确地表示这几个变量是做计数器的。器的。类型定义的步骤:类型定义的步骤:第一步:第一步:象说明一个普通的变量一样,用希望象说明一个普通的变量一样,用希望新命名的数据类型定义一个变量。新命名的数据类型定义一个变量。例如,例如,inti;第二步:第二步:将第二步定义的变量名用新的类型名将第二步定义的变量名用新的类型名代替。例如,代替。例如,intCOUNTER;第三步:第三步:将第二步定义的句子前加上将第二步定义的句子前加上typedef。例如,例如,typedefintCOUNTER;COUNTER成为一种新的数据类型名。成为一种新的数据类型名。

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

最新文档


当前位置:首页 > 高等教育 > 研究生课件

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