《哈工大c语言课件12》由会员分享,可在线阅读,更多相关《哈工大c语言课件12(60页珍藏版)》请在金锄头文库上搜索。
1、第第1212章章 结构体和结构体和 共用体共用体哈尔滨工业大学计算机科学与技术学院*2/60本章学习内容本章学习内容 结构体数据类型,共用体数据类型,枚举数据类型结构体数据类型,共用体数据类型,枚举数据类型 ,定义数据类型的别名,定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初结构体变量、结构体数组、结构体指针的定义和初 始化始化 结构体成员的引用,成员选择运算符,指向运算符结构体成员的引用,成员选择运算符,指向运算符 向函数传递结构体变量、结构体数组、结构体指针向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表动态数据结构、动态链表*3/60 二进制数二进制
2、数类型本不存在类型本不存在 内存里存的内容,你认为它是什么,它就内存里存的内容,你认为它是什么,它就 是什么是什么 在早期的机器指令及汇编语言中,数据对在早期的机器指令及汇编语言中,数据对 象均用二进制数表示,没有类型的概念象均用二进制数表示,没有类型的概念 一般的一般的CPUCPU只支持两种类型只支持两种类型 整数、浮点数整数、浮点数12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型*4/60 在高级语言引入了基本数据类型在高级语言引入了基本数据类型 整型、浮点型、字符型等整型、浮点型、字符型等 不同语言会定义不同的基本类型不同语言会定义不同的基本类型 基本数据类型并不
3、能方便地解决所有问题基本数据类型并不能方便地解决所有问题 有些语言(如有些语言(如PL/1PL/1)中试图规定较多的类型,如)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法数组、树、栈等,但实践证明不是个好办法12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型*5/60 用户自己构造数据类型用户自己构造数据类型- -复合数据类型复合数据类型 由基本数据类型迭代派生而来,表示复杂的数据对象由基本数据类型迭代派生而来,表示复杂的数据对象 典型的代表就是典型的代表就是“结构体结构体” 抽象数据类型(抽象数据类型(Abstract Data TypeAbstrac
4、t Data Type,简称,简称ADTADT) 在复合数据类型基础上增加了对数据的操作在复合数据类型基础上增加了对数据的操作 抽象数据类型进而进化为抽象数据类型进而进化为“ “类类(Class)”(Class)” 这是一个跨时代的进步这是一个跨时代的进步 ClassClass是是Object-OrientedObject-Oriented的一个重要概念的一个重要概念12.112.1从基本数据类型到抽象数据类型从基本数据类型到抽象数据类型*6/6012.2.112.2.1为什么要定义结构体类型为什么要定义结构体类型 在程序里表示一个人(姓名、年龄、性别在程序里表示一个人(姓名、年龄、性别),)
5、, 怎么表示?怎么表示? 想表示多个人呢?想表示多个人呢? 如何用计算机程序实现下述表格的管理?如何用计算机程序实现下述表格的管理? *7/60数组的解决方法数组的解决方法*8/60数组的解决方法数组的解决方法*9/60 数据的内存管理方式数据的内存管理方式 数组的解决方法数组的解决方法分配内存不集中,寻址效率不高 对数组赋初值时,易发生错位 结构显得零散,不易管理*10/60希望的内存分配图希望的内存分配图*11/60结构体结构体类型类型的声明的声明声明了一个结构体类型构成结构体的变量 称为结构体的成员 (Structure Member)结构体的名字 称为结构体标 签(Structure
6、Tag)*12/60结构体结构体类型类型的声明的声明结构体模板 (Structure Template)Dont forget the semicolon!形成一个类型声明的样板形成一个类型声明的样板 用于生成结构体变量用于生成结构体变量 但并未声明结构体变量但并未声明结构体变量 因而编译器不为其分配内存因而编译器不为其分配内存 *13/60(1)先定义结构体类型,再定义变量名(2)在定义类型的同时定义变量(3)直接定义结构体变量(不指定结构体标签)12.2.212.2.2结构体结构体变量变量的定义的定义*14/6012.2.312.2.3用用typedeftypedef定义数据类型定义数据类
7、型structstruct studentstudent stu1, stu2;stu1, stu2;/*It works*/*It works*/ studentstudent stu1, stu2; stu1, stu2; /*Can this work?*/*Can this work?*/ structstruct stu1, stu2; stu1, stu2; /*Can this work?*/*Can this work?*/ STUDENTSTUDENT stu1, stu2;stu1, stu2; /*It works!*/*It works!*/关键字typedef为一种
8、已存在的类型定义一个 别名,并未定义新类型STUDENT与struct student类型是同义词*15/60等价于12.2.412.2.4结构体变量的初始化结构体变量的初始化等价于注意!注意!*16/60 嵌套的结构体(嵌套的结构体(Nested StructureNested Structure)就是在一个)就是在一个 结构体内包含了另一个结构体作为其成员结构体内包含了另一个结构体作为其成员 12.2.512.2.5嵌套的结构体嵌套的结构体结构体定义 可以嵌套*17/60 访问结构体变量的成员必须使用访问结构体变量的成员必须使用成员选择运算符成员选择运算符 (也称圆点运算符)(也称圆点运算
9、符) 12.2.612.2.6结构体变量的引用结构体变量的引用 当出现结构体嵌套时,必须当出现结构体嵌套时,必须 以级联方式访问结构体成员以级联方式访问结构体成员*18/60【例例12.112.1】演示结构体变量的赋值和引用方法演示结构体变量的赋值和引用方法12.2.612.2.6结构体变量的引用结构体变量的引用按结构体的成员顺序逐 一对相应成员进行赋值格式符%02d中2d前面的前导符0表示输 出数据时,若左边有多余位,则补0*19/60【例例12.112.1】 若要从键若要从键 盘输入结盘输入结 构体变量构体变量 stu1stu1的内的内 容,那么容,那么 程序如何程序如何 修改?修改?两个
10、地址有何不同?*20/60【例例12.112.1】 若要从键若要从键 盘输入结盘输入结 构体变量构体变量 stu1stu1的内的内 容,那么容,那么 程序如何程序如何 修改?修改?结构体成员的地址与 该成员在结构体中所 处的位置及其所占内 存的字节数相关结构体变量的地址 ); 用运算符用运算符sizeofsizeof获得结构体大小获得结构体大小 sizeofsizeof( (变量或表达式变量或表达式) ) sizeofsizeof( (类型类型) )1212printf(“%dn“, sizeof(printf(“%dn“, sizeof(SAMPLESAMPLE););【例例12.212.2
11、】*22/6012.2.712.2.7结构体所占内存的字节数结构体所占内存的字节数事实上,所有数据类型在内存中都是从偶数偶数地址开始存放的 且结构所占的实际空间一般是按照机器字长对齐的 不同的编译器、平台,对齐方式会有变化 结构体变量的成员的存储对齐规则对齐规则是与机器相关的 具有特定数据类型的数据项大小数据项大小也是与机器相关的 所以一个结构体在内存中的存储格式也是与机器相关的chchf fchchchchchchf f*23/6012.312.3结构体结构体数组数组的定义和初始化的定义和初始化*24/6012.312.3结构体结构体数组数组的定义和初始化的定义和初始化建立了数据库中的多条记
12、录,每条对应一个学生信息*25/60【例例12.312.3】利用利用 结构体数组计结构体数组计 算每个学生的算每个学生的 平均分平均分*26/6012.412.4结构体结构体指针指针的定义和初始化的定义和初始化ptstu1STUDENTSTUDENT stu1;stu1; STUDENTSTUDENT * *pt; pt; pt = pt = stu1;成员1成员2成员3成员4成员5 如何定义指向如何定义指向结构体变量结构体变量的指针?的指针? STUDENTSTUDENT * *pt = pt = stu1;等价于*27/6012.412.4结构体结构体指针指针的定义和初始化的定义和初始化
13、如何访问如何访问结构体指针变量结构体指针变量所指向的所指向的 结构体成员呢?结构体成员呢? STUDENTSTUDENT stu1;stu1; STUDENTSTUDENT * *pt = pt = stu1;ptstu1 成员1成员2成员3成员4成员5 通过通过s stu1tu1和和成员选择运算符成员选择运算符访问结构体成员访问结构体成员 stu1.stu1. studentID = 1; studentID = 1; 通过通过ptpt和和指向运算符指向运算符访问结构体成员访问结构体成员 (*pt).(*pt). studentID = 1; studentID = 1;pt -pt - s
14、tudentID = 1; studentID = 1;*28/6012.412.4结构体结构体指针指针的定义和初始化的定义和初始化ptstu1 成员1成员2成员3成员4成员5 当结构体当结构体嵌套嵌套时,如何访问结构体时,如何访问结构体 指针变量所指向的结构体成员?指针变量所指向的结构体成员?stu1.stu1. birthday.birthday.year = 1999; year = 1999; (*pt).(*pt). birthday.birthday.year = 1999; year = 1999;pt -pt - birthday.birthday.year = 1999; y
15、ear = 1999;STUDENTSTUDENT stu1;stu1; STUDENTSTUDENT * *pt = pt = stu1;*29/6012.412.4结构体结构体指针指针的定义和初始化的定义和初始化STUDENTSTUDENT stu30;stu30; STUDENTSTUDENT * *pt;pt;pt = stu; pt = stu; 如何定义指向如何定义指向结构体数组结构体数组的指针?的指针? STUDENTSTUDENT * *pt = stu;pt = stu;等价于STUDENTSTUDENT * *pt = pt = 等价于ptstu30 stu0stu1stu2stu3stu4stu5.stu29*30/60使用使用pt+pt+,使,使ptpt指向指向stu1stu1pt - pt - studentIDstudentID等价于等价于 stu1. stu1. studentIDstudentIDpt12.412.4结构体结构体指针指针的定义和初始化的定义和初始化STUDENTSTUDENT stu