- 1、本文档共136页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c语言程序设计(郑莉第四版)课件6解读
特别注意: (1)一般来说,指针的算术运算和数组的使用相联系,因为只有在使用数组时,才会得到连续分布的可操作的内存空间。 (2)对于独立变量的地址,如果进行算术运算,然后对其结果所指向的地址进行操作,有可能会意外破坏该地址中的数据和代码。 (3)指针的算术运算时一定要确保运算结果所指向的指针是程序分配使用的地址。 (4)指针的算术运算要慎用 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 函数名就表示函数代码在内存中的起始地址,所以调用函数实质就是调用指定地址的代码。 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 指针与引用的联系 引用在底层通过指针来实现 一个引用变量,通过存储被引用对象的地址,来标识它所引用的对象 引用是对指针的包装,比指针更高级 指针是C语言就有的底层概念,使用起来很灵活,但用不好容易出错 引用隐藏了指针的“地址”概念,不能直接对地址操作,比指针更安全 * 深度探索 引用与指针的选择 什么时候用引用? 如无需直接对地址进行操作,指针一般都可用引用代替 用更多的引用代替指针,更简洁、安全 什么时候用指针? 引用的功能没有指针强大,有时不得不用指针: 引用一经初始化,无法更改被引用对象,如有这种需求,必须用指针; 没有空引用,但有空指针,如果空指针有存在的必要,必须用指针; 函数指针; 用new动态创建的对象或数组,用指针存储其地址最自然; 函数调用时,以数组形式传递大量数据时,需要用指针作为参数。 * 深度探索 指针的地址安全性问题 地址安全性问题 通过指针,访问了不该访问的地址,就会出问题 典型问题:数组下标越界 问题的严重性:有时会在不知不觉中产生错误,错误源很难定位,因此程序调试起来很麻烦 解决方案 指针只有赋了初值才能使用(这一点普通变量也应遵循) 指针的算术运算,一定要限制在通过指向数组中某个元素的指针,得到指向同一个数组中另一个元素的指针 尽量使用封装的数组(如vector),而不直接对指针进行操作 * 深度探索 指针的类型安全性问题(1) 基本类型数据的转换是基于内容的: 例: int i = 2; float x = static_castfloat(i); 目标类型不同的指针间的转换,会使一种类型数据的二进制序列被当作另一种类型的数据: reinterpret_cast:可以将一种类型的指针转换为另一种类型 int i = 2; float *p = reinterpret_castfloat *(i); 结论 从一种具体类型指针转换为另一种具体类型指针的reinterpret_cast很不安全,一般情况下不要用 * 深度探索 指针的类型安全性问题(2) void指针与具体类型指针的转换: 具体类型指针可以隐含地转换为void指针: int i = 2; void *vp = i; void指针转换为具体类型指针需要用static_cast,例如: int *p = static_castint *(vp); 但这样就出问题了: float *p2 = static_castfloat *(vp); 结论 void指针也容易带来不安全,尽量不用,在不得不用的时候,一定要在将void指针转换为具体类型指针时,确保指针被转换为它最初的类型。 * 深度探索 堆对象的管理 堆对象必须用delete删除 避免“内存泄漏” 原则很简单,但在复杂的程序中,一个堆对象常常要被多个不同的类、模块访问,该在哪里删除,常常引起混乱 如何有条理地管理堆对象 明确每个堆对象的归属 最理想的情况:在一个类的成员函数中创建的堆对象,也在这个类的成员函数中删除 把对象的建立和删除变成了一个类的局部问题 如需在不同类之间转移堆对象的归属,一定要在注释中注明,作为类的对外接口约定 例如在一个函数内创建堆对象并将其返回,则该对象应当由调用该函数的类负责删除 * 深度探索 const_cast介绍 const_cast的用法 用于将常指针、常引用转换为不带“const”的相关类型 例: void foo(const int *cp) { int *p = const_castint *(cp); (*p)++; } 这可以通过常指针修改指针发对象的值,但这是不安全的用法,因为破坏了接口中const的约定 const_cast不是安全的转换,但有时可以安全地使用 * 深度探索 const_cast的安全使用(1) 对例6-18的改进 例6-1
文档评论(0)