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

上传人:本田雅阁 文档编号:2261521 上传时间:2019-03-12 格式:PPT 页数:54 大小:553.01KB
返回 下载 相关 举报
第六章(续)结构体等构造数据类型.ppt_第1页
第1页 / 共54页
第六章(续)结构体等构造数据类型.ppt_第2页
第2页 / 共54页
第六章(续)结构体等构造数据类型.ppt_第3页
第3页 / 共54页
亲,该文档总共54页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、第六章 结构体等构造数据类型,第6章 结构体等构造数据类型,6.1 结构体 6.2 共用体 6.3 枚举型 6.4 Typedef的用途,C的数据类型:,整型 int 基本数据类型 浮点型 float double 字符型 char 数组 以 为标志 结构 struct 构造类型 复杂数据类型 联合 union 枚举 enum 指针类型 以 * 为标志 空类型,结构体类型的数据由若干个变量组成,每一个变量既可以是一个基本数据类型的数据,也可以是另一个构造类型的数据。 结构体实际上是C编译没有提供的数据类型。,6.1 结构体,结构体的说明 一般格式: struct 结构体名 类型名1 结构体成员

2、名表1; 类型名2 结构体成员名表2; 。 类型名n 结构体成员名表n; ;,例:要先定义一个结构体类型:time。time是时间,当然可以用三个整型变量来表示一个时间, int hour; int minute; int second; 但是不能表示三个变量之间的逻辑关系。,若把时间说明为TIME ,而TIME含有小时、分、秒三个成分,则TIME的结构体说明是: struct TIME int hour; int minute; int second; ;,其中struct 是关键字,TIME是结构体的类型名,它实际上规定了一种新的复杂数据类型。 在随后的程序中就可以使用TIME定义结构体变

3、量了。例: struct TIME meeting_begin;,结构体类型变量的定义,结构体变量定义有三种方法: 方法一:先说明结构体,再定义结构体变量。例: struct point int x; int y; ; struct point p1,p2;,方法二: 在说明结构体类型的同时定义结构体变量。 例如: struct TIME int hour; int minute; int second; meeting_begin,meeting_end;,这种方法的语法格式是: struct 结构体名 类型名1 结构体成员名表1; 类型名2 结构体成员名表2; 。 类型名n 结构体成员名表

4、n; 结构体变量表;,方法三:是在说明结构体时直接定义结构体变量,并且不用指定结构体名。 struct int hour; int minute; int second; meeting_begin,meeting_end;,这种方法的语法格式是: struct 类型名1 结构体成员名表1; 类型名2 结构体成员名表2; 。 类型名n 结构体成员名表n; 结构体变量表;,结构体成员的引用 C语言中对结构体变量的使用是通过对其成员的引用来实现的。一般不能对结构体变量进行整体的引用。 引用的方法: 结构体变量名.成员名 符号“.”是依据结构体变量名存取结构体成员的运算符。,#include “st

5、dio.h“ void main() struct TIME int hour; int minute; int second; ; struct TIME mt_begin;,例:用符号“.”引用结构体变量的成员。,mt_begin.hour=8; mt_begin.minute=30; mt_begin.second=00; printf(“n meeting time is %2d:%2d:%2d“, mt_begin.hour,mt_begin. minute,mt_begin.second); ,运行结果: meeting time is 8:30:00,结构体的初始化 对结构体变量

6、的初始化与对数组的初始化相似,因为存储分配时,通常按照各成员在结构体中出现的先后顺序连续排列。 struct TIME audit_begin=8,30,0; 如果初始化数值的个数小于结构体成员的个数,系统会自动将其它成员初始化为0。,#include “stdio.h“ void main() struct TIME int hour; int minute; int second; ; struct TIME meeting_begin=8,30,00;,例:结构体变量的初始化,printf(“n audition time is %2d:%2d:%2d“, audit_begin.hou

7、r, audit_begin.minute, audit_begin.second); ,运行结果: meeting time is 8:30:00,struct student_type long int num; /*学号*/ struct date_type int month; int day; int year; birthday; /*出生日期*/ stu; 可以使用scanf(“%d”,&stu.birthday.day) 输入数据。但是不能引用stu.birthday。,结构体的嵌套,注意,对嵌套结构体的引用必须引用到最末一级。,注:结构体类型和结构变量,结构体类型和结构体变量

8、是不同概念。先定义结构类型,再定义结构变量。 定义结构类型后,不会为其分配内存空间。只有当变量被说明,才会为其分配存储空间。 结构类型不能进行运算、赋值,而结构变量可以。,结构体中包含数组,struct student_type long int num; /*学号*/ char name10; /*姓名*/ struct date_type int month; int day; int year; birthday; /*出生日期*/ stu;,例:结构体中包含数组。 #include “stdio.h“ void main() int i; struct STOCK char stock

9、name16; /*股票名称 */ char stockcode7; /*股票代码 */ float price3; /*买入价、卖出价、成交价 */ ;,Struct STOCK sfz=“ShenFaZhan“,“000001“,8.77,8.78,8.78; /*用深发展的数据初始化结构体变量sfz*/ printf(“n %s %s “, sfz.stockname, sfz .stockcode); /*输出股票名称和股票代码 */ for (i=0;i3;i+) /*输出股票的买入价、卖出价和成交价*/ printf(“%6.2f “, sfz.pricei); ,结构体数组,定义

10、结构体数组的语法: struct 结构体名 数组名长度; 访问结构体数组中的结构体成员的方法是: 数组名下标.成员名,6.2 公用体,公用体又称为联合体。 在编制一些比较高级的程序时,有时需要把不同类型的变量放在同一存储区域内。 一个变量x,它既可以用来存储一个单字符还可以存储一个浮点数或是一个整数,当然,在一个时间点,它只能存放其中的一种数据,新的数据覆盖老的数据,新的数据是什么数据类型,x变量就是什么数据类型。,一般格式: union 公用体名 类型名1 公用体成员名表1; 类型名2 公用体成员名表2; 。 类型名n 公用体成员名表n; 公用体变量名表;,共用体的说明,例如, union

11、mixed char c; float f; int i; ; 注:mixed为公用体名,与说明结构体一样,说明一个公用体,只是说明了一种新的数据类型,并不引起内存的分配。,联合体变量的定义 联合体变量的定义方法也有三种: 先说明联合体,再定义联合体变量 在说明联合体类型的同时定义联合体变量 直接定义联合体变量。,union mixed char c; float f; int i; ; union mixed x;,union char c; float f; int i; x;,union mixed char c; float f; int i x;,与结构体变量不同的是,公用体 变量在

12、内存中所占的字节数是成员表 中最大的,而不象结构体变量是所有 成员所占字节数的总和。,union mixed x=a; 这时,系统按成员c对第一个字 节赋值,其余单元的值为0。,在定义时共用体的初始化,对于公用体变量成员的直接引用是使用运算符“.”,语法是: 公用体变量名.成员名。 例如x.f,可以将x.f看成一个普通的浮点型数据进行存取。,共用体的引用,注: 不能对联合体变量x直接存取内容。 如:x=15.00是错误的,只能对x的三个成员进行操作,这三个成员是x.f、x.i和x.c,并且这三个联合体成员不可能同时存在。,例:在下面的程序中,执行语句x.i=10;以后x.f的值是不能够确定的。

13、 #include “stdio.h“ union mixed char c; float f; int i; ; void main() union mixed x; x.i=10; printf(“%f“,x.f); /*xf的值不确定 */ ,练习,1、定义一个包括年、月、日的结构体变量,将其转换成这年中的第几天输入。(不考虑闰年,2月为28天) 2、利用结构体编写程序,实现输入三个学生的学号,姓名,数学成绩,将他们按成绩的高低进行排列,并输出,struct date_type int month; int day; int year; date; main() int i,j=0; s

14、canf(“%d%d“, ,题1,6.3 枚举 使用枚举变量的主要目的是提高 程序的可读性,所谓“枚举”就是把所 有可能的取值情况列举出来。例如, 真和假表示了逻辑值的两种情况,男 和女是性别的两种取值,选修课成绩 有“优”、“良”、“中”、“及格”和“不及格”五种取值。,枚举的说明和枚举变量的定义 枚举的说明格式为: enum 枚举名 枚举元素表(逗号分隔) ;,enum color red,green,blue,yellow,white ; enum bool false,true ;,枚举元素是常量,有固定的数值, 按枚举的顺序分别是整数0、1、2,不 能将其当作变量使用,也就是说不能在

15、 赋值号的左边使用枚举元素。 例如,true=1;是错误的。 注意,不能有两个相同名字的枚举元素, 枚举元素也不能与其它的变量同名。,枚举变量的定义与结构体相类似,也有三种: (1) 与枚举说明分开定义 enum 枚举名 变量名表; 例如: enum color red,green,blue,yellow,white ; enum color select,change; select和change是枚举变量。,(2) 与枚举说明一起定义 例如: enum color red,green,blue,yellow,white select,change; (3) 不说明枚举名,直接定义枚举变量

16、例如: enum red,green,blue,yellow,white select,change;,枚举变量的使用 枚举变量的使用与结构体变量 完全不同。 如果一个变量被定义为是一个 枚举变量,则它的取值只能取自对 应的枚举元素,而不能是其它任何 数。,如果有定义 enum red,green,blue,yellow,white select,change; 则select=red;和change=white; 都是正确的,而select=red_white是 错误的,因为red_white并没有在 枚举元素表中出现。,枚举元素是常量,有固定的数值, 按枚举的顺序分别是整数0、1、2,不

17、能将其当作变量使用,也就是说不能在 赋值号的左边使用枚举元素。 例如,true=1;是错误的。 注意,不能有两个相同名字的枚举元素, 枚举元素也不能与其它的变量同名。,C编译对枚举元素作为常整数处 理,遇到枚举元素时,编译程序把 其中第一个枚举元素赋值为0,第2 个赋值为1,所以select=red;和 change=white;两句赋值语句执行以 后,select的值为0,change的值为4。,C语言允许程序员将某些枚举元素 强制赋值,指定为一整数常量,被强制 赋值的枚举元素后面的值按顺序逐个增1。 enum color red,green,blue=5,yellow,white /*实际

18、值为0,1,5,6,7*/ ;,枚举元素是常量,有固定的数值, 按枚举的顺序分别是整数0、1、2,不 能将其当作变量使用,也就是说不能在 赋值号的左边使用枚举元素。 例如,true=1;是错误的。 注意,不能有两个相同名字的枚举元素, 枚举元素也不能与其它的变量同名。,使用枚举类型时,不提倡将整型值 与枚举元素直接联系起来,只要简单地 把这些变量看成具有某种特点的枚举类 型的变量。 enum bool false,true flag; if (flag=false),6.4类型定义 使用类型定义的目的是简化结 构体和联合体等构造类型的类型说明, 同时可以增强可读性。 类型定义的一般格式是: t

19、ypedef 原类型名 新类型名; 功能:将原类型名表示的数据类 型用新类型名代替。,typedef int COUNTER; 现在COUNTER 是int的另一个 名字,那么,使用COUNTER i,j,k; 定义变量i、j和k以后,它们实际上 都是整型数,用COUNTER 定义可 以明确地表示这几个变量是做计数 器的。,typedef char STRING81; STRING text,input_line; text和input_line是包含81个字符 的数组。 typedef char *STRING_PTR; STRING_PTR buffer; buffer为指向字符的指针。,

20、typedef struct time int hour; int minute; int second; TIME; TIME可以直接作为一种新的数据 类型说明符,而不必再使用关键字struct 了。 TIME birth; birth 变量的数据类型是time结构体类型。,typedef int COUNTER; 现在COUNTER 是int的另一个 名字,那么,使用COUNTER i,j,k; 定义变量i、j和k以后,它们实际上 都是整型数,用COUNTER 定义可 以明确地表示这几个变量是做计数 器的。,类型定义的步骤: 第一步: 象说明一个普通的变量一样,用希望 新命名的数据类型定义一个变量。 例如,int i; 第二步: 将第二步定义的变量名用新的类型名 代替。例如,int COUNTER; 第三步: 将第二步定义的句子前加上typedef。 例如,typedef int COUNTER; COUNTER成为一种新的数据类型名。,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1