欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C语言程序设计PPT课件第12章结构体和共用体.ppt

    • 资源ID:6504043       资源大小:2.32MB        全文页数:60页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C语言程序设计PPT课件第12章结构体和共用体.ppt

    第12章 结构体和共用体,本章学习内容,结构体数据类型,共用体数据类型,枚举数据类型,定义数据类型的别名 结构体变量、结构体数组、结构体指针的定义和初始化 结构体成员的引用,成员选择运算符,指向运算符 向函数传递结构体变量、结构体数组、结构体指针 动态数据结构、动态链表,二进制数类型本不存在内存里存的内容,你认为它是什么,它就是什么在早期的机器指令及汇编语言中,数据对象均用二进制数表示,没有类型的概念一般的CPU只支持两种类型整数、浮点数,12.1从基本数据类型到抽象数据类型,在高级语言引入了基本数据类型整型、浮点型、字符型等不同语言会定义不同的基本类型基本数据类型并不能方便地解决所有问题有些语言(如PL/1)中试图规定较多的类型,如数组、树、栈等,但实践证明不是个好办法,12.1从基本数据类型到抽象数据类型,用户自己构造数据类型-复合数据类型由基本数据类型迭代派生而来,表示复杂的数据对象典型的代表就是“结构体”抽象数据类型(Abstract Data Type,简称ADT)在复合数据类型基础上增加了对数据的操作抽象数据类型进而进化为“类(Class)”这是一个跨时代的进步Class是Object-Oriented的一个重要概念,12.1从基本数据类型到抽象数据类型,为什么要定义结构体类型,在程序里表示一个人(姓名、年龄、性别),怎么表示?想表示多个人呢?如何用计算机程序实现下述表格的管理?,数组的解决方法,数组的解决方法,数据的内存管理方式,数组的解决方法,分配内存不集中,寻址效率不高 对数组赋初值时,易发生错位 结构显得零散,不易管理,希望的内存分配图,结构体类型的声明,声明了一个结构体类型,构成结构体的变量称为结构体的成员(Structure Member),结构体的名字称为结构体标签(Structure Tag),结构体类型的声明,结构体模板(Structure Template),Dont forget the semicolon!,形成一个类型声明的样板用于生成结构体变量但并未声明结构体变量因而编译器不为其分配内存,(1)先定义结构体类型,再定义变量名,(2)在定义类型的同时定义变量,(3)直接定义结构体变量(不指定结构体标签),结构体变量的定义,用typedef定义数据类型,struct student stu1,stu2;/*It works*/student stu1,stu2;/*Can this work?*/struct stu1,stu2;/*Can this work?*/STUDENT stu1,stu2;/*It works!*/,关键字typedef为一种已存在的类型定义一个别名,并未定义新类型,STUDENT与struct student类型是同义词,等价于,结构体变量的初始化,等价于,注意!,嵌套的结构体(Nested Structure)就是在一个结构体内包含了另一个结构体作为其成员,嵌套的结构体,结构体定义可以嵌套,访问结构体变量的成员必须使用成员选择运算符(也称圆点运算符),结构体变量的引用,当出现结构体嵌套时,必须以级联方式访问结构体成员,【例12.1】演示结构体变量的赋值和引用方法,结构体变量的引用,按结构体的成员顺序逐一对相应成员进行赋值,格式符%02d中2d前面的前导符0表示输出数据时,若左边有多余位,则补0,【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?,两个地址有何不同?,【例12.1】若要从键盘输入结构体变量stu1的内容,那么程序如何修改?,结构体成员的地址与该成员在结构体中所处的位置及其所占内存的字节数相关,结构体变量的地址&stu2是该变量所占内存空间的首地址,结构体所占内存的字节数,struct 类型用内存字节数=?是所有成员变量的内存总和吗?,printf(%dn,sizeof(struct sample);,用运算符sizeof获得结构体大小sizeof(变量或表达式)sizeof(类型),12,Why?,printf(%dn,sizeof(SAMPLE);,【例12.2】,结构体所占内存的字节数,事实上,所有数据类型在内存中都是从偶数地址开始存放的且结构所占的实际空间一般是按照机器字长对齐的不同的编译器、平台,对齐方式会有变化结构体变量的成员的存储对齐规则是与机器相关的具有特定数据类型的数据项大小也是与机器相关的所以一个结构体在内存中的存储格式也是与机器相关的,非所有成员变量的内存总和,12个字节,12.3结构体数组的定义和初始化,12.3结构体数组的定义和初始化,建立了数据库中的多条记录,每条对应一个学生信息,【例12.3】利用结构体数组计算每个学生的平均分,12.4结构体指针的定义和初始化,pt,stu1,STUDENT stu1;STUDENT*pt;pt=,如何定义指向结构体变量的指针?,STUDENT*pt=,等价于,12.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-birthday.year=1999;,STUDENT stu1;STUDENT*pt=,12.4结构体指针的定义和初始化,STUDENT stu30;STUDENT*pt;pt=stu;,如何定义指向结构体数组的指针?,STUDENT*pt=stu;,等价于,STUDENT*pt=,等价于,pt,stu30,使用pt+,使pt指向stu1pt-studentID等价于 stu1.studentID,pt,12.4结构体指针的定义和初始化,STUDENT stu30;STUDENT*pt=stu;,如何访问结构体数组指针指向的结构体成员?,stu30,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 function 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 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向函数传递结构体,向函数传递结构体的完整结构复制整个结构体成员的内容,多个值函数内对结构内容的修改不影响原结构内容传递更直观,但开销大向函数传递结构体的首地址用结构体数组/结构体指针作函数参数仅复制结构体的首地址,一个值修改结构体指针所指向的结构体的内容指针传递效率高,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)把关系紧密且逻辑相关的多种不同类型的变量,组织到统一的名字之下占用相邻的一段内存单元共用体,也称联合(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)取决于占空间最多的那个成员变量,同一内存单元在每一瞬时只能存放其中一种类型的成员起作用的成员是最后一次存放的成员,不能作为函数参数不能进行比较操作,只能对第一个成员初始化,f,4个字节,12.6共用体,12.6共用体,枚举数据类型,枚举(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;enum response no=-1,yes=1,none=0;,其值为2,其值为1,下面的结构是什么意思?struct temp int data;struct temp pt;CB下的错误提示:field pt has incomplete typeVC下的错误提示:pt uses undefined struct temp下面的结构是什么意思呢?struct temp int data;struct temp*pt;,可包含指向本结构体类型的指针变量,问题的提出,动态数据结构单向链表,struct Link int data;struct Link*next;,链表(Linked Table):线性表的链式存储结构特点:用一组任意的存储单元存储线性表的数据;存储单元可以是连续的,也可是不连续的,链表的定义,链表(Linked table):线性表的链式存储结构为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息,两部分信息组成一个节点,struct Link int data;struct Link*next;,数据域:存储数据元素信息,指针域:存储直接后继的节点信息,链表的定义,链表(Linked Table):线性表的链式存储结构为表示每个元素与后继元素的逻辑关系,除存储元素本身信息外,还要存储其直接后继信息,struct Link int data;struct Link*next;,n个节点链接成一个链表(因为只包含一个指针域,故又称线性链表或单向链表),链表的建立,向链表中添加一个新节点,空指针NULL表示链表结尾,链表的头指针:访问链表的关键,链表的建立,若原链表为空表(head=NULL),则将新建节点p置为头节点,(1)head=p,(2)pr=p,(3)pr-next=NULL,链表的建立,若原链表为非空,则将新建节点p添加到表尾,(1)pr-next=p,(2)pr=p,(3)pr-next=NULL,next,链表的删除操作,若原链表为空表,则退出程序 若待删除节点p是头节点,则将head指向当前节点的下一个节点即可删除当前节点,(1)head=p-next,head,(2)free(p),链表的删除操作,若待删除节点不是头节点,则将前一节点的指针域指向当前节点的下一节点即可删除当前节点,(1)pr-next=p-next,若已搜索到表尾(p-next=NULL)仍未找到待删除节点,则显示“未找到”,(2)free(p),链表的插入操作,若原链表为空表,则将新节点p作为头节点,让head指向新节点p,(1)head=p,p=(struct link*)malloc(sizeof(struct link);p-next=NULL;p-data=nodeData;,链表的插入操作,若原链表为非空,则按节点值(假设已按升序排序)的大小确定插入新节点的位置若在头节点前插入新节点,则将新节点的指针域指向原链表的头节点,且让head指向新节点,(2)head=p,(1)p-next=head,链表的插入操作,若在链表中间插入新节点,则将新节点的指针域指向下一节点且让前一节点的指针域指向新节点,(2)pr-next=p,(1)p-next=pr-next,链表的插入操作,若在表尾插入新节点,则末节点指针域指向新节点,(1)pr-next=p,next,链表的输出,遍历链表的所有节点,Questions and answers,

    注意事项

    本文(C语言程序设计PPT课件第12章结构体和共用体.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开