- 1、本文档共46页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C第7章指针
内存、地址、指针、指向示意图 §7.2 指针变量的定义和使用 C语言的指针有类型 某个指针只能指向其声明的特定数据类型的变量 如果一个指针被声明成指向整型变量的指针,则在程序中就认定该指针所指向的总是整型变量 基本的指针变量定义形式 数据类型 * 指针变量名; 如:int *p;//定义一个整型指针变量p 同时定义多个同类型的指针变量的形式 数据类型 *指针变量名1, *指针变量名2, …, 指针变量名n; 如:int *p, *q;//定义两个整型指针变量p和q,注意每个指针变量名前都要有“*” 指针变量和其它类型同时定义 如:int *p, a[10], x, *q;//定义了两个整型指针p,q,一个整型数组a,一个整型变量x * * * * * * * * * * * * * * * * * * * * * * * * * * * §7.6.1 为什么需要动态存储管理 静态存储管理 外部变量、局部静态变量在编译时确定存储分配 局部自动变量在进入变量定义所在的复合语句时确定存储分配 总之,静态存储管理保证变量在使用之前已经分配确定的存储单元 优点:实现方便、效率高 缺点:限制了程序的自由度。如定义数组时必须指明数组的每一维的长度 动态存储管理 在程序运行中动态确定存储分配,可以根据需要动态申请任意大小的存储块 动态存储分配是程序运行中动态申请内存块,所以无法为动态分配的存储块命名 一般通过指针指向动态申请得到的存储块,然后对指针间接操作访问存储块 动态分配的存储块必须动态释放 §7.6 动态存储管理 C语言的动态存储管理由标准库函数实现 动态存储管理的库函数包含在stdlib.h头文件中 存储分配函数malloc() 原型:void *malloc(size_t n); 带计数和初始化功能的动态存储分配函数calloc() 原型:void *calloc(size_t n, size_t size); 动态存储释放函数free() 原型:void free(void *p); 分配调整函数realloc() 原型:void *realloc(void *p, size_t n); 注意掌握上述4个为库函数的原型、各部分的意义及它们的使用 §7.6.2 C语言的动态存储管理机制 §7.6.3 程序实例 使用筛法输出某整数范围内的所有素数。整数的范围由命令行参数得到。如果命令行没有参数,则要求用户输入一个确定范围的整数值。 1.将筛法算法作为一个函数来处理 2.带有参数的main函数 3.通过命令行传递的参数是字符串,需要将字符串转换成它所表示的整数 4.可以使用指针参数的函数来实现输入整数的功能 教材P246例题,改造第6章的学生成绩统计和直方图生成程序,使之能处理任意多的学生成绩。 动态申请内存单元绝大多数的情况下是可以成功得到的,但是并不排除申请失败的情况,因此在使用动态存储的单元之前要检查分配成功与否。 If((p = (… *) malloc(…)) == NULL) { … } 使用动态申请得到的内存单元时要注意防止出现越界错误,系统不检查 动态申请的内存单元生存期仅和free()有关,和申请该内存的函数无关 使用动态申请的内存单元的唯一手段就是指向该单元的指针,失去了这个指针就丢失了内存块 在函数中申请,使用局部自动指针变量指向,函数结束时这个指针会自动撤消 程序中无意的给指向动态单元的指针赋了值 如果没有释放动态申请的内存,在整个程序执行期间该内存单元都不会释放,直到程序结束,才由操作系统负责回收。 动态存储管理的要点 函数、指针和动态存储应用的模式主要有两种 需要在函数里处理一组数据,并把处理结果返回到调用函数时,最适合的办法就是在函数调用时提供数组的首地址和元素的数目(优点是在函数中不用关心调用者传递过来的是数组还是动态分配的存储单元) 动态存储的申请必须在被调用的函数内部,该函数在内部完成存储空间的申请、数据的输入或处理,再把存储单元的首地址和数据的数目送出来 动态存储中存储空间动态增长的调整策略 realloc()的工作原理:新申请一个更大的存储空间,将原来已满空间中的内容复制到新的存储空间中 两种动态增长的调整策略 固定的增量 成倍的增长 两种调整策略的优缺点 §7.6.4 函数、指针和动态存储 为什么要定义类型 随着数组、指针等概念的引入,描述类型的语法越来越复杂,为了简化这些复杂类型的使用,引入了定义类型的机制 C语言定义类型的机制是什么样的 给复杂的类型描述定义一个名字,把复杂的类型描述看作是一个新的类型 定义类型的优点 简化程序 类型描述的一致 C语言中定义类型的基本语法 typedef 已有类型定义形式 新类型名字 如:typedef int * PINT;//给整型指针定
文档评论(0)