C19第10章 用户自定义数据类型
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
10.1.1 结构型的定义
C语言中用关键字struct定义结构型,形式为: 语言中用关键字struct定义结构型,形式为: struct定义结构型 struct 结构型名 { 类型 变量名; 变量名; …… 类型 }; 其中,结构型名为标识符。 其中,结构型名为标识符。 新结构型的名称为“struct结构型名” 需用C 新结构型的名称为“struct结构型名”。需用C语句定 结构型名 义结构型 , 变量名; 变量名;
10. 10.2 联合型 10. 10.3 枚举型 10.4 为类型自定义别名 10.
数据类型
C语言基本的数据类型有整型、浮点型、字符型和指针 语言基本的数据类型有整型、浮点型、 类型。数据类型用于定义变量, 类型。数据类型用于定义变量,变量标识了内存中的一块 存储单元, 存储单元,数据类型则规定了与变量相关存储单元的类型 ,即大小、数据的编码格式等。数据类型是具有相同特征 即大小、数据的编码格式等。 的一类数据的抽象, 的一类数据的抽象,而变量通常存放了属于某数据类型的 一个具体值。 一个具体值。 一个数组变量由多个变量组成,因此, 一个数组变量由多个变量组成,因此,数组又称为构造 数据类型。 数据类型。
10.1 结构型
用计算机解决实际问题时, 用计算机解决实际问题时,常常需使用多个数据描述同一个对 象。如在学生成绩管理系统中,一个学生的信息通常包括学号、 如在学生成绩管理系统中,一个学生的信息通常包括学号、 姓名、数学成绩、英语成绩等多个数据。 姓名、数学成绩、英语成绩等多个数据。虽然可以定义一个整型 变量存储学号、定义一个字符型数组变量存储姓名,定义两个浮 变量存储学号、定义一个字符型数组变量存储姓名, 点型变量存储数学和英语成绩 但是,一个学生的信息分散在几个变量中, 但是,一个学生的信息分散在几个变量中,处理起来十分不便 。可以先定义一种称为结构型的数据类型,使分散的多个变量组 可以先定义一种称为结构型的数据类型, 成一个整体,再用新定义的结构型定义变量, 成一个整体,再用新定义的结构型定义变量,最后用该结构型变 量表示学生的信息,使一个学生的信息保存在一个变量中。 量表示学生的信息,使一个学生的信息保存在一个变量中。
return 89}};或 90, 75}, {1002, "Li4", 85, 89}};或struct student
stu[2] = {1001, "Zhang3", 90, 75, 1002, "Li4", 85,
10.1.2 指向结构型的指针变量
定义指向结构型的指针变量的方法与定义指向其他类型 的指针变量没有区别,如语句struct *pstu;就 的指针变量没有区别,如语句struct student *pstu;就 定义了一个指向结构型struct student的指针变量pstu。 的指针变量pstu 定义了一个指向结构型struct student的指针变量pstu。 语句pstu = &stu1;就使得指针变量pstu指向了结构型 &stu1;就使得指针变量pstu指向了结构型 就使得指针变量pstu 语句pstu 变量stu1, 变量stu1,且*pstu与变量stu1等价,故结构型变量stu1 stu1 pstu与变量stu1等价,故结构型变量stu1 与变量stu1等价 的成员也可用(*pstu).no、(*pstu).name等引用。 的成员也可用(*pstu).no、(*pstu).name等引用。 (*pstu).no 等引用 注意:(*pstu).name不能写作*pstu.name。 注意:(*pstu).name不能写作*pstu.name。 不能写作 使用指针变量访问结构型的成员变量时, 使用指针变量访问结构型的成员变量时,可以使用指向 成员操作符成员操作符->,如(*pstu).no可写作pstu->no, (*pstu).no可写作pstu->no, 可写作pstu (*pstu).name可写作pstu->name。 (*pstu).name可写作pstu->name。 可写作pstu
标识成员变量
标识成员变量时需用成员操作符“.”, stu1.no就表示 标识成员变量时需用成员操作符“.”,如stu1.no就表示 stu1变量中的整型成员变量no, stu2.name[0]就表示stu2 stu1变量中的整型成员变量no,而stu2.name[0]就表示stu2 变量中的整型成员变量no 就表示 变量中的字符型数组成员变量name(stu2.name) 变量中的字符型数组成员变量name(stu2.name)的第一个 name 数组元素(成员操作符具有最高的优先级)。 数组元素(成员操作符具有最高的优先级)。 数组型变量和结构型变量的区别? 数组型变量和结构型变量的区别? 可见,数组型变量由几个类型相同的变量组成, 可见,数组型变量由几个类型相同的变量组成,而结构型 变量由几个不限制类型的变量组成。与数组变量相关的变量 变量由几个不限制类型的变量组成。 由数组名加[下标]标示, 由数组名加[下标]标示,而与结构型变量相关的变量由结构 型变量名加. 成员操作符)成员变量名标识。 型变量名加.(成员操作符)成员变量名标识。
例10-2 复数及其运算
例10-2 复数及其运算
例10-2 复数及其运算
return
10.1.3 链表
分析下面定义的结构型: 分析下面定义的结构型: struct node { int data; struct node *next; }; 结构型struct node的成员变量中包含了一个指向它自 结构型struct node的成员变量中包含了一个指向它自 身的指针类型struct *,在定义此类型的结构中, 身的指针类型struct node *,在定义此类型的结构中, 怎么可以包含指向自身的指针类型呢? 怎么可以包含指向自身的指针类型呢? 因为无论什么类型的指针变量, 因为无论什么类型的指针变量,其存储单元的长度都是
结构型变量初始化和结构型数组 变量
可以在定义时初始化结构型变量, 可以在定义时初始化结构型变量,C语言中构造数据类 型的变量常用一对{}初始化。结构型显然是构造型, 型的变量常用一对{}初始化。结构型显然是构造型,因此 {}初始化 结构型变量初始化时也用一对{}, 结构型变量初始化时也用一对{},如struct student {} stu1 = {1001, "Zhang3", 90, 75};。 75};。 可以定义,如语句struct stu[2];就定义了两 可以定义,如语句struct student stu[2];就定义了两 student型变量stu[0]和stu[1], 型变量stu[0] 个struct student型变量stu[0]和stu[1],相关成员变量 的标识类似stu[0].no。也可在定义时初始化数组元素, 的标识类似stu[0].no。也可在定义时初始化数组元素, stu[0].no 如语句struct 如语句struct student stu[2] = {{1001, "Zhang3",
链表
包含了指向自身类型的指针的结构型变量可以连接起来 ,串成一串,这样一来变量之间也就有了逻辑上的先后顺 串成一串, 序。如 struct node *head, node1, node2; head = &node1; node1.data = 23; node1.next = &node2; node2.data = 32; node2.next = NULL; 设变量node1与node2的地址分别为0x0012 设变量node1与node2的地址分别为0x0012 ff74,0x0012 noΒιβλιοθήκη Baidue1 的地址分别为 ff6c,则变量head,node1和node2的关系可用图10- 表示。 ff6c,则变量head,node1和node2的关系可用图10-1表示。 则变量head,node1 的关系可用图10
例10-3把多个学生的信息用链 表组织起来。
注意:
为代码简洁, 1. 为代码简洁,本例中链表的首结点为一个结构型变 量而非指针变量,其称为链表的头结点。 量而非指针变量,其称为链表的头结点。头结点可以不存 储任何信息,也可以存储如链表的长度等附加信息。 储任何信息,也可以存储如链表的长度等附加信息。 2. 构造链表时,先动态生成一个结点,然后把它链接 构造链表时,先动态生成一个结点, 在链表最后的结点上( 在链表最后的结点上(动态生成结点的链表也称为动态链 表)。 在程序的最后,从链表的头结点开始, 3. 在程序的最后,从链表的头结点开始,依次输出了 每个结点的信息。 每个结点的信息。
例10-1 输入两个学生信息,按 数学成绩升序输出他们的信息
可以在定义结构型的同时定义 变量
如语句 struct student { int no; char name[10]; float fm, fe; }stu1, stu2; 定义了一个结构型struct student, 定义了一个结构型struct student,同时定义了此类型的 两个变量stu1和stu2。 两个变量stu1和stu2。如果程序中不再使用结构型的名称 stu1 student定义新的变量 则可省略结构型名student 定义新的变量, struct student定义新的变量,则可省略结构型名student ,定义一个匿名的结构型。匿名的结构型由于没有名称只能 定义一个匿名的结构型。
注意
与数组变量不同, 与数组变量不同,两个类型相同的结构型变量可以互相 赋值,即使结构型变量的成员中有数组, 赋值,即使结构型变量的成员中有数组,赋值操作也可以 顺利进行。 顺利进行。 因为结构型变量通常由多个成员变量组成,形参为结构 因为结构型变量通常由多个成员变量组成, 型时参数传递既浪费时间又浪费空间, 型时参数传递既浪费时间又浪费空间,所以常把形参的类 型由结构型改为指向该结构型的指针类型以提高效率。 型由结构型改为指向该结构型的指针类型以提高效率。
结构型定义变量
定义了一个结构型struct student。 定义了一个结构型struct student。可以用它定义变量 , stu2;定义了两个 如语句 struct student stu1, stu2;定义了两个 student型的变量stu1和stu2。 型的变量stu1 struct student型的变量stu1和stu2。 变量stu1和 变量stu1和stu2 stu1
链表
变量head,node1和head2如同一条铁链,一环扣一环, 变量head,node1和head2如同一条铁链,一环扣一环, head 如同一条铁链 称为链表。 称为链表。 链表中的变量称为结点, 链表中的变量称为结点,指针类型的首结点又称为链表 的头指针。链表通常用头指针标识,头指针为空时, 的头指针。链表通常用头指针标识,头指针为空时,则链 表为“空表” 其长度为零。 表为“空表”,其长度为零。如果要查找某元素是否在链 表中,则必须从头指针开始, 表中,则必须从头指针开始,依次访问链表中的每个结点 。
自定义的数据类型
C语言允许程序员根据需要,通过对已有数据类型的限 语言允许程序员根据需要, 定、组合来定义新的数据类型,这种由用户自已定义的数 组合来定义新的数据类型, 据类型,称为用户自定义数据类型。 据类型,称为用户自定义数据类型。用户自定义数据类型 也用于定义变量,且与变量相关存储单元的类型由用户自 也用于定义变量, 定义数据类型规定。 定义数据类型规定。 C语言中用户可自定义的数据类型有结构型(structure 语言中用户可自定义的数据类型有结构型( )、联合型(union)和枚举型(enumeration)。 )、联合型(union)和枚举型(enumeration)。 联合型
新编C语言程序设计教程
清华大学出版社
周二强
zeq@hncj.edu.cn 软件学院
计算机科学与工程系
配套视频:zeq126.56.com 配套视频: 博客: 博客:blog.csdn.net/stunt
第10章 用户自定义数据类型 10章
10. 10.1 结构型
10.1.1 结构型的定义 10.1.2 指向结构型的指针变量 10.1.3 链表