新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt

上传人:rrsccc 文档编号:10464190 上传时间:2021-05-17 格式:PPT 页数:40 大小:284KB
返回 下载 相关 举报
新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt_第1页
第1页 / 共40页
新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt_第2页
第2页 / 共40页
新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt_第3页
第3页 / 共40页
新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt_第4页
第4页 / 共40页
新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt_第5页
第5页 / 共40页
点击查看更多>>
资源描述

《新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt》由会员分享,可在线阅读,更多相关《新编C语言程序设计教程PPT第10章 用户自定义数据类型.ppt(40页珍藏版)》请在三一文库上搜索。

1、新编C语言程序设计教程 清华大学出版社,周二强 软件学院 计算机科学与工程系 配套视频: 博客:,第10章 用户自定义数据类型,10.1 结构型 10.1.1 结构型的定义 10.1.2 指向结构型的指针变量 10.1.3 链表 10.2 联合型 10.3 枚举型 10.4 为类型自定义别名,数据类型,C语言基本的数据类型有整型、浮点型、字符型和指针类型。数据类型用于定义变量,变量标识了内存中的一块存储单元,数据类型则规定了与变量相关存储单元的类型,即大小、数据的编码格式等。数据类型是具有相同特征的一类数据的抽象,而变量通常存放了属于某数据类型的一个具体值。 一个数组变量由多个变量组成,因此,

2、数组又称为构造数据类型。,自定义的数据类型,C语言允许程序员根据需要,通过对已有数据类型的限定、组合来定义新的数据类型,这种由用户自已定义的数据类型,称为用户自定义数据类型。用户自定义数据类型也用于定义变量,且与变量相关存储单元的类型由用户自定义数据类型规定。 C语言中用户可自定义的数据类型有结构型(structure)、联合型(union)和枚举型(enumeration)。,10.1 结构型,用计算机解决实际问题时,常常需使用多个数据描述同一个对象。如在学生成绩管理系统中,一个学生的信息通常包括学号、姓名、数学成绩、英语成绩等多个数据。虽然可以定义一个整型变量存储学号、定义一个字符型数组变

3、量存储姓名,定义两个浮点型变量存储数学和英语成绩 但是,一个学生的信息分散在几个变量中,处理起来十分不便。可以先定义一种称为结构型的数据类型,使分散的多个变量组成一个整体,再用新定义的结构型定义变量,最后用该结构型变量表示学生的信息,使一个学生的信息保存在一个变量中。,10.1.1 结构型的定义,C语言中用关键字struct定义结构型,形式为: struct 结构型名类型 变量名;类型 变量名;; 其中,结构型名为标识符。 新结构型的名称为“struct结构型名”。需用C语句定义结构型 ,,结构型定义变量,定义了一个结构型struct student。可以用它定义变量, 如语句 struct

4、student stu1, stu2;定义了两个struct student型的变量stu1和stu2。 变量stu1和stu2,标识成员变量,标识成员变量时需用成员操作符“.”,如stu1.no就表示stu1变量中的整型成员变量no,而stu2.name0就表示stu2变量中的字符型数组成员变量name(stu2.name)的第一个数组元素(成员操作符具有最高的优先级)。 数组型变量和结构型变量的区别? 可见,数组型变量由几个类型相同的变量组成,而结构型变量由几个不限制类型的变量组成。与数组变量相关的变量由数组名加下标标示,而与结构型变量相关的变量由结构型变量名加.(成员操作符)成员变量名标

5、识。,例10-1 输入两个学生信息,按数学成绩升序输出他们的信息,可以在定义结构型的同时定义变量,如语句 struct student int no; char name10; float fm, fe;stu1, stu2; 定义了一个结构型struct student,同时定义了此类型的两个变量stu1和stu2。如果程序中不再使用结构型的名称struct student定义新的变量,则可省略结构型名student,定义一个匿名的结构型。匿名的结构型由于没有名称只能在定义结构型的同时定义此类型的变量。,结构型变量初始化和结构型数组变量,可以在定义时初始化结构型变量,C语言中构造数据类型的变

6、量常用一对初始化。结构型显然是构造型,因此结构型变量初始化时也用一对,如struct student stu1 = 1001, Zhang3, 90, 75;。 可以定义,如语句struct student stu2;就定义了两个struct student型变量stu0和stu1,相关成员变量的标识类似stu0.no。也可在定义时初始化数组元素,如语句struct student stu2 = 1001, Zhang3, 90, 75, 1002, Li4, 85, 89;或struct student stu2 = 1001, Zhang3, 90, 75, 1002, Li4, 85,

7、89;所示。,return,10.1.2 指向结构型的指针变量,定义指向结构型的指针变量的方法与定义指向其他类型的指针变量没有区别,如语句struct student *pstu;就定义了一个指向结构型struct student的指针变量pstu。 语句pstu = 就使得指针变量pstu指向了结构型变量stu1,且*pstu与变量stu1等价,故结构型变量stu1的成员也可用(*pstu).no、(*pstu).name等引用。 注意:(*pstu).name不能写作*pstu.name。 使用指针变量访问结构型的成员变量时,可以使用指向成员操作符-,如(*pstu).no可写作pstu-

8、no,(*pstu).name可写作pstu-name。,注意,与数组变量不同,两个类型相同的结构型变量可以互相赋值,即使结构型变量的成员中有数组,赋值操作也可以顺利进行。 因为结构型变量通常由多个成员变量组成,形参为结构型时参数传递既浪费时间又浪费空间,所以常把形参的类型由结构型改为指向该结构型的指针类型以提高效率。,例10-2 复数及其运算,例10-2 复数及其运算,例10-2 复数及其运算,return,10.1.3 链表,分析下面定义的结构型:struct node int data; struct node *next; 结构型struct node的成员变量中包含了一个指向它自身的

9、指针类型struct node *,在定义此类型的结构中,怎么可以包含指向自身的指针类型呢? 因为无论什么类型的指针变量,其存储单元的长度都是固定的。,链表,包含了指向自身类型的指针的结构型变量可以连接起来,串成一串,这样一来变量之间也就有了逻辑上的先后顺序。如 struct node *head, node1, node2; head = 设变量node1与node2的地址分别为0 x0012 ff74,0 x0012 ff6c,则变量head,node1和node2的关系可用图10-1表示。,链表,变量head,node1和head2如同一条铁链,一环扣一环,称为链表。 链表中的变量称为结

10、点,指针类型的首结点又称为链表的头指针。链表通常用头指针标识,头指针为空时,则链表为“空表”,其长度为零。如果要查找某元素是否在链表中,则必须从头指针开始,依次访问链表中的每个结点。,例10-3把多个学生的信息用链表组织起来。,注意:,1. 为代码简洁,本例中链表的首结点为一个结构型变量而非指针变量,其称为链表的头结点。头结点可以不存储任何信息,也可以存储如链表的长度等附加信息。 2. 构造链表时,先动态生成一个结点,然后把它链接在链表最后的结点上(动态生成结点的链表也称为动态链表)。 3. 在程序的最后,从链表的头结点开始,依次输出了每个结点的信息。,例10-4利用链表完成例9.30。,分析

11、: 可以使用如图10-2所示的首尾相接成环状的循环链表。,例10-4,例10-4,例10-4,return,10.2 联合型,联合类型用关键字union定义,一般形式为 union联合型名 类型 变量名; 类型 变量名; 一个联合型变量也包含了多个成员变量,但与结构型变量的不同之处在于,这些成员变量共享一个存储单元。在定义联合型变量时,编译系统只分配一个能够存放成员中长度最长的变量的存储单元供所有成员变量共享使用,因此联合型也称为共用型。,联合型,如语句union data int i; double f; 定义了一个名为union data的联合型。语句union data u;定义了一个联

12、合型变量u,它有两个成员变量u.i和u.f,它的内存状态可能如图10-3所示。,联合型变量,从图10-3可以看出,联合型变量u的存储单元从0 x0012 ff78开始共8个字节,当使用成员变量u.i存储数据时,从0 x0012 ff78开始的4个字节的存储单元被使用,且数据的存储格式为int型。当使用成员变量u.f存储数据时,从0 x0012 ff78开始的8个字节的存储单元被使用,且数据的存储格式为double型。 读取成员变量,例10-5联合型的使用,return,10.3 枚举型,生活中,有些数据的取值范围是固定的,如表示星期几的数据,表示性别的数据等。 这类数据编程时常用整型表示,如用

13、0表示女用1表示男。用整型表示此类数据既不直观,又容易出错, 如整型变量sex表示某个人的性别时,语句sex = 5;在语法上没有问题,但实际上程序中已经出现了逻辑错误。,枚举型,C语言中可以用“枚举型”的数据类型表示此类数据。枚举型是用户自定义类型,定义时列举出此类数据所有可能的取值,定义后就可以用它定义枚举型变量,枚举型变量的取值仅限于定义枚举型时列举出的值。 C语言中用关键字enum定义枚举型,定义枚举型的一般形式为:enum 枚举型名 枚举常量列表;,枚举常量列表,其中,枚举常量列表由逗号分隔的枚举常量组成,枚举常量与枚举型名均为标识符,且枚举常量在命名时习惯上用大写字母,如语句enu

14、m color BLACK, BLUE, RED, GREEN;就定义了一个枚举型enum color。 利用此枚举型就可以定义枚举型变量,如语句enum color col1, col2;定义了两个枚举型变量col1和col2,且它们只能取值enum color型定义时规定的枚举型常量,如col1 = BLUE;或col2 = GREEN;等。,枚举常量,枚举常量对应于一个整数值,第一个枚举常量默认值为0,其它枚举常量的值为前一个枚举常量的值加1。 enum color BLACK, BLUE, RED, GREEN; 在定义枚举型时可以显式地对某个枚举常量赋值,如有定义enum color

15、 RED = 1, BLACK = 1, BLUE, GREEN = -10,则枚举型enum color中枚举常量BLUE的值为2。当enum color型变量col的值为 GREEN时,语句printf(%dn, col);的输出值为-10。,枚举类型与整型,C语言中枚举类型与整型的关系密切。枚举变量输出或参与比较操作时,其值为相关枚举常量对应的整数值。如: enum weekday Sun, Mon, Tue, Wed, Thu, Fri, Sat day1, day2; if(day1 = day2) if(day1 Sat) 或if(day1 6) int i; for(i=Sun;

16、 i=Sat;+i) ,注意:,在某些编译器中可以用整数给枚举型变量赋值,这显然违背了使用枚举型的初衷。如需用整数给枚举型变量赋值时,规范的用法是用强制类型转换。 需注意,由于枚举型ennm color的枚举常量RED和BLACK的值都为1,故语句col = (enum color)1;的执行结果在C语言中没有明确规定,变量col的值有可能为RED,也有可能为BLACK。最好不要规定两个枚举常量的值相同。,例10-6 枚举类型的使用,return,10.4 为类型自定义别名,C语言中用关键字typedef可以为数据类型定义一个别名。如有typedef int INTEGER;,则标识符INTE

17、GER就是int的一个别名,两者可以互换使用。 typedef定义类型别名的操作是在编译时处理的,是C语言语句,因此不要忘记语句的结束标志分号;。去掉typedef关键字后,定义别名的语句就变成了一个变量定义的语句,如int INTEGER;就定义了一个整型变量INTEGER,所以typedef语句定义的是去掉关键字typedef后相关变量的类型的别名。,类型自定义别名,如float A5;定义了一个长度为5的float型数组变量A,而typedef float A5;则为有5个元素的float型一维数组定义了别名A。 定义了别名A后,语句A a1 = 1.1, 2.2, 3.3, a2;就定

18、义了两个长度为5的float型一维数组变量a1和a2,且a1的数组元素还被初始化了,即a10 = 1.1、a11 = 2.2、a12 = 3.3、a14 = a15 = 0.0。,自定义数据类型,语句typedef struct node NODE;定义了结构型struct node的别名NODE。还可以在定义自定义数据类型的同时定义其别名,如 typedef struct nodeint data;struct node *next;NODE;,注意:,语句typedef structdouble rp,ip;COMPLEX, *PCOM; 定义了两个别名,一个为COMPLEX, 另一个为指向此类型的指针类型PCOM,即COMPLEX *p1;与PCOM p1;等价。,return,

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

当前位置:首页 > 社会民生


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