《结构体共用体》ppt课件

上传人:tian****1990 文档编号:75806211 上传时间:2019-02-01 格式:PPT 页数:60 大小:3.73MB
返回 下载 相关 举报
《结构体共用体》ppt课件_第1页
第1页 / 共60页
《结构体共用体》ppt课件_第2页
第2页 / 共60页
《结构体共用体》ppt课件_第3页
第3页 / 共60页
《结构体共用体》ppt课件_第4页
第4页 / 共60页
《结构体共用体》ppt课件_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《《结构体共用体》ppt课件》由会员分享,可在线阅读,更多相关《《结构体共用体》ppt课件(60页珍藏版)》请在金锄头文库上搜索。

1、第12章 结构体和共用体,南京中医药大学信息技术学院,本章学习内容, 结构体数据类型,共用体数据类型,枚举数据类型,定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初始化 结构体成员的引用,成员选择运算符,指向运算符 向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表,二进制数类型本不存在 内存里存的内容,你认为它是什么,它就是什么 在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念 一般的CPU只支持两种类型 整数、浮点数,12.1从基本数据类型到抽象数据类型,在高级语言引入了基本数据类型 整型、浮点型、字符型等 不同语言会定义不同的基本类

2、型 基本数据类型并不能方便地解决所有问题 有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,12.1从基本数据类型到抽象数据类型,用户自己构造数据类型-复合数据类型 由基本数据类型迭代派生而来,表示复杂的数据对象 典型的代表就是“结构体” 抽象数据类型(Abstract Data Type,简称ADT) 在复合数据类型基础上增加了对数据的操作 抽象数据类型进而进化为“类(Class)” 这是一个跨时代的进步 Class是Object-Oriented的一个重要概念,12.1从基本数据类型到抽象数据类型,12.2.1为什么要定义结构体类型,在程序里表示一个人(

3、姓名、年龄、性别),怎么表示? 想表示多个人呢? 如何用计算机程序实现下述表格的管理?,数组的解决方法,数组的解决方法,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组赋初值时,易发生错位 结构显得零散,不易管理,希望的内存分配图,结构体类型的声明,声明了一个结构体类型,构成结构体的变量称为结构体的成员(Structure Member),结构体的名字称为结构体标签(Structure Tag),结构体类型的声明,结构体模板(Structure Template),Dont forget the semicolon!,形成一个类型声明的样板 用于生成结构体变量 但并未声

4、明结构体变量 因而编译器不为其分配内存,(1)先定义结构体类型,再定义变量名,(2)在定义类型的同时定义变量,(3)直接定义结构体变量(不指定结构体标签),12.2.2结构体变量的定义,12.2.3用typedef定义数据类型,struct student stu1, stu2;/*It works*/ STUDENT stu1, stu2; /*It works!*/,关键字typedef为一种已存在的类型定义一个别名,并未定义新类型,STUDENT与struct student类型是同义词,等价于,12.2.4结构体变量的初始化,等价于,注意!,嵌套的结构体(Nested Structur

5、e)就是在一个结构体内包含了另一个结构体作为其成员,12.2.5嵌套的结构体,结构体定义 可以嵌套,访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符),12.2.6结构体变量的引用,当出现结构体嵌套时,必须以级联方式访问结构体成员,【例12.1】演示结构体变量的赋值和引用方法,12.2.6结构体变量的引用,按结构体的成员顺序逐一对相应成员进行赋值,格式符%02d中2d前面的前导符0表示输出数据时,若左边有多余位,则补0,【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?,两个地址有何不同?,【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?

6、,结构体成员的地址与该成员在结构体中所处的位置及其所占内存的字节数相关,结构体变量的地址&stu2是该变量所占内存空间的首地址,12.2.7结构体所占内存的字节数,struct 类型用内存字节数 = ? 是所有成员变量的内存总和吗?,printf(“%dn“, sizeof(struct sample);,用运算符sizeof获得结构体大小 sizeof(变量或表达式) sizeof(类型),12,Why?,printf(“%dn“, sizeof(SAMPLE);,【例12.2】,12.2.7结构体所占内存的字节数,事实上,所有数据类型在内存中都是从偶数地址开始存放的 且结构所占的实际空间一

7、般是按照机器字长对齐的 不同的编译器、平台,对齐方式会有变化 结构体变量的成员的存储对齐规则是与机器相关的 具有特定数据类型的数据项大小也是与机器相关的 所以一个结构体在内存中的存储格式也是与机器相关的,非所有成员变量的内存总和,12个字节,12.3结构体数组的定义和初始化,12.3结构体数组的定义和初始化,建立了数据库中的多条记录,每条对应一个学生信息,【例12.3】利用结构体数组计算每个学生的平均分,12.4结构体指针的定义和初始化,pt,stu1,STUDENT stu1; STUDENT *pt; pt = ,如何定义指向结构体变量的指针?,STUDENT *pt = ,等价于,12.

8、4结构体指针的定义和初始化,如何访问结构体指针变量所指向的结构体成员呢?,STUDENT stu1; STUDENT *pt = ,pt,stu1,通过stu1和成员选择运算符访问结构体成员 stu1. studentID = 1; 通过pt和指向运算符访问结构体成员 (*pt). studentID = 1; pt - studentID = 1;,12.4结构体指针的定义和初始化,pt,stu1,当结构体嵌套时,如何访问结构体指针变量所指向的结构体成员?,stu1. birthday. year = 1999; (*pt). birthday. year = 1999; pt - birt

9、hday. year = 1999;,STUDENT stu1; STUDENT *pt = ,12.4结构体指针的定义和初始化,STUDENT stu30; STUDENT *pt; pt = stu;,如何定义指向结构体数组的指针?,STUDENT *pt = stu;,等价于,STUDENT *pt = ,等价于,pt,stu30,使用pt+,使pt指向stu1 pt - studentID 等价于 stu1. studentID,pt,12.4结构体指针的定义和初始化,STUDENT stu30; STUDENT *pt = stu;,如何访问结构体数组指针指向的结构体成员?,stu3

10、0,12.5向函数传递结构体,用结构体的单个成员作为函数参数,向函数传递结构体的单个成员 (传值) 复制单个成员的内容 函数内对结构内容的修改不影响原结构 用结构体变量作函数参数,向函数传递结构体的完整结构 (传值) 用结构体指针或结构体数组作函数参数,向函数传递结构体的首地址 (传址),struct date int year; int month; int day; ; void func(struct date p) p.year = 2000; p.month = 5; p.day = 22; ,Before function call:1999/04/23,After functio

11、n call:1999/04/23,结构体变量 作函数参数,【例12.4】,struct date int year; int month; int day; ; void func(struct date *p) p-year = 2000; p-month = 5; p-day = 22; ,Before function call:1999/04/23,After function call:2000/05/22,结构体指针 作函数参数,指针作函数形参 实参必须为地址值,【例12.5】,struct date int year; int month; int day; ; struct

12、date func(struct date p) p.year = 2000; p.month = 5; p.day = 22; return p; ,Before function call:1999/04/23,After function call:2000/05/22,结构体变量 作函数返回值,【例12.6】,12.5向函数传递结构体,向函数传递结构体的完整结构 复制整个结构体成员的内容,多个值 函数内对结构内容的修改不影响原结构 内容传递更直观,但开销大 向函数传递结构体的首地址 用结构体数组/结构体指针作函数参数 仅复制结构体的首地址,一个值 修改结构体指针所指向的结构体的内容 指

13、针传递效率高,12.5向函数传递结构体,【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5向函数传递结构体,【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5向函数传递结构体,【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分,12.5向函数传递结构体,【例12.7】修改例12.3程序,用结构体数组作函数参数编程并输出计算学生的平均分,用户自定义的数据类型,结构体(Struct) 把关系紧密且逻辑相关的多种不同类型的变量,组织到统一的名字之下 占用相邻的一段内存单元 共用体,也称

14、联合(Union) 把情形互斥但逻辑相关的多种不同类型的变量,组织到统一的名字之下 占用同一段内存单元,每一时刻只有一个数据起作用,12.6共用体,struct sample short i; char ch; float f; ;,union sample short i; char ch; float f; ;,printf(“%dn“, sizeof(struct sample);,8个字节,i,ch,f,4个字节,printf(“%dn“, sizeof(union sample);,【例12.8】,12.6共用体,sizeof(union number)取决于占空间最多的那个成员变量

15、,同一内存单元在每一瞬时只能存放其中一种类型的成员 起作用的成员是最后一次存放的成员,不能作为函数参数 不能进行比较操作,只能对第一个成员初始化,f,4个字节,12.6共用体,12.6共用体,12.7.1枚举数据类型,枚举(Enumeration)数据类型 描述的是一组整型值的集合 用于当某些量仅由有限个数据值组成时 enum weeks SUN, MON, TUE, WED, THU, FRI, SAT; enum weeks today; enum response no, yes, none; enum response answer; today = TUE; answer = yes

16、; enum response no = -1, yes = 1, none = 0;,其值为2,其值为1,下面的结构是什么意思? struct temp int data; struct temp pt; ; CB下的错误提示: field pt has incomplete type VC下的错误提示: pt uses undefined struct temp 下面的结构是什么意思呢? struct temp int data; struct temp *pt; ;,可包含指向本结构体类型的指针变量,问题的提出,12.7.2动态数据结构单向链表,struct Link int data; struct Link *next; ;,链表(Linked Ta

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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