已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C 面向对象程序设计 第九章指针与动态数组葛勇 概览 指针指针变量基本内存管理虚悬指针静态变量和动态变量编程提示 定义指针类型动态数组数组变量和指针变量创建和使用动态数组指针运算多维动态数组 可选 9 1指针 指针 pointer 是变量的内存地址 指针变量是用来操作计算机内存地址的 在C 中有时会将内存地址作为变量的名称来使用 如以前用过的函数引用形参 在调用该函数时 就是将对应于该形参的实参地址传给这个形参 从而以形参的操作实际上是在实参所在的内存地址上进行操作的 相对于函数的引用形参来讲 C 中还有更重要的操作内存地址的方式 就是使用指针 指针的声明 声明一个指针变量的方法可如下进行 double p 上面的 位置可以靠近类型double 也可以靠近变量p 也可以都不靠近 如下的声明都是合法的 double p double p 上述声明均声明了一个指针变量p 它只能用来指向一个double类型的变量 而不以指 指针变量的赋值 向其它类型的变量 如 doublea 10 1 p 则是非法的 指针变量可以和普通变量在一行进行声明 如 int p1 p2 v1 v2 则声明了两个int型指针变量p1 p2 以及两个int型变量v1 v2 注意这里v1 v2不是指针变量 为了避免造成误解 请把 号靠近变量名 改成如下声明方式 int p1 p2 v1 v2 提倡使用 指针的提领操作 为了读取一个指针变量指向的地址上所存储的值 可使用 操作进行提领 如 inta 10 int p 最后一行的语句则将p所指向的地址 即a的地址上的值 也即是变量a的值10赋值给变量b 再如 inta 10 int p 则此时a的值为3 也就是说p指向的地址值一旦改变了 a的值也相应的改了 实际上 指针p操作的就是a的地址 值得注意的是 使用地址赋值与使用 提领符进行赋值是有区别的 如对 int p1 p2 p1 p2 和 p1 p2 有什么区别 p1 p2与 p1 p2的区别 includeusingnamespacestd intmain int p1 p2 inta 3 b 5 p1 cout p1 p1 t p1 p2与 p1 p2的区别 p2 p2 t a a t b b endl cout 再重新让p1指向a p2指向b n p1 比较结果 现在a 3 b 5 p1指向a p2指向b 经过p1 p2后 p1 5 p2 5a 3b 5再重新让p1指向a p2指向b 经过p1 p2后 p1 5 p2 5a 5b 5 一个指针声明后如果不进行赋值操作 称为指针的初始化 则该指针不指向任何对象 提领操作 如 p是非法 即对内存进行非法操作 如下程序 未初始化的指针 includeusingnamespacestd intmain int p1 cout p1 endl 未初始化的指针 一个指针可以指向一个无名变量 如 double dp dp newdouble 上一语句中的new操作符的作用是分配一块容纳double类型值的内存 在32位机器上也就是分配8Bytes大小的内存以存储一个double类型的值 而newdouble则返回这块的内存地址值 从而对dp进行初始化 也就是p指向这块新分配的内存地址 但这块内存地址没有变量来表示 从而可视为无名变量 对这块地址的操作 如赋值 可通过指向它的指针来进行 如 dp 5 5 指针的类型可以是任意已经定义的变量类型 如 string sp vector vp structwords charzimu intnum words wp wd wd zimu a wd num 3 wp 都是合法的 注意 wp zimu与 wp zimu有什么不同 为什么 new操作符 new操作分配内存的方式还有许多好的特性 int n n newint 17 int ip newint 10 但inta newint 10 是非法的 includeusingnamespacestd intmain int n newint 17 inta n cout a a endl int ip newint 10 for inti 0 i 10 i ip i i i for inti 0 i 10 i cout ip i cout endl a 170149162536496481 练习 P 339 7版P 355 4 5 内存管理 当一个指针变量所动态分配的内存不再使用时 就需要将它释放出来 交给操作系统 以便其它的程序使用 这时我们可使用delete操作符 如 int p newint deletep 则将为p动态分配的内存释放出来 此时p不再指向之前分配的内存地址了 称p为虚悬指针 对于动态分配的数组 可使用delete来释放内存 如 int ip newint 10 delete p 注意 在使用delete释放指针所指向的内存地址 一定要指针指向动态分配的内存地址 否则delete就变得毫无意义了 如 int ip newint 17 inta 10 ip 也没有错误提示 但毫无疑问 这样delete令人啼笑皆非 另外红色部分的代码还有一个问题 指针变量ip后来因为ip 不再指向动态分配的内存地址 而这块地址也没有释放出来交还给操作系统 这样 在程序中无法再释放给操作系统 这是我们编程中需要特别注意的 静态变量和动态变量 使用操作符new创建的变量称为动态变量 它们是在程序运行期间创建和销毁的 与动态变量相比 普通变量似乎则称为静态变量 但C 并不是这样称呼的 在C 中表态变量是指用关键字static声明的变量 如 staticinta 静态变量 includeusingnamespacestd intstaticfun intmain inta a staticfun cout 第一次调用 a a endl 静态变量 a staticfun cout 第二次调用 a a endl intstaticfun staticinta 1 a returna 静态变量的使用 第一次调用 a 2第二次调用 a 3 定义指针类型 定义指针类型的目的是为了使得声明指针时和声明普通变量采用同样的方式来进行 如果 int p1 p2 则声明一个指针变量p1和一个普通变量p2 但我们的意图可能并不总是如此 有时 可能我们本来想声明p1 p2都是指针变量 但是因为疏忽 漏了一个 而出错 为了避免这种错误 我们可以将int 这样的int型指针 类型定义为一个别名 如 typedefint intPtr 再如下声明指针 intPtrp1 p2 则p1 p2都是int型指针变量 练习 P 342 7版P 358 7 8 9 2动态数组 动态数组 dynamicarray 是指不指定长度的一种数组 它的长度是在程序运行时来确定 9 2 1数组变量和指针变量 includeusingnamespacestd typedefint IntPtr intmain IntPtrp inta 10 9 2动态数组 for inti 0 i 10 i a i i p a for inti 0 i 10 i cout p i cout endl for inti 0 i 10 i cout a i cout endl 01234567890123456789 从上述代码可以看出 当指针指向一个数组时 同样可以如数组变量一样使用下标操作符 来获得数组元素的值 但指针还可以使用如p 操作 意思是让p指向当前数组元素的下一个元素 但数组变量则不可以 如a 是非法的 不过 可使用a 1 如 a i 得到a的第i个元素的值 由此可得 数组名实际上也是一种指针 但是这种指针不能让其指向的地址发生改变 与指针的区别在于 指针变量可以随意让其指向其它对象 而数组变量不可以 对于指针的使用方法还有如下 p a for inti 0 i 10 i cout p cout endl 或for inti 0 i 10 i cout p i cout endl 都可以依次输出数组的元素值 9 2 2创建和使用动态数组 动态数组需要借助于指针来完成 如 int p newint 10 相当是声明了一个10个元素的动态数组 而p指向该动态数组的首元素的地址 当不再使用这些地址时 则使用 delete p 进行释放 如下列程序 使用动态数组 include includeusingnamespacestd typedefint IntArrayPtr voidfill array inta intsize voidsort inta intsize voidswap int 使用动态数组 intArraySize cout ArraySize IntArrayPtra a newint ArraySize fill array a ArraySize sort a ArraySize cout 排序后这些数是 n for inti 0 i ArraySize i cout a i cout endl 使用动态数组 delete a voidfill array inta intsize cout a i voidsort inta intsize 使用动态数组 for intpass 1 passa i 1 swap a i a i 1 voidswap int 练习 P 347 7版P 363 10 12 131 将上例中的swap函数写成参数为指针类型的形式 并写出调用示例 多维动态数组 includeusingnamespacestd typedefint IntArrayP
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 动物疫病防控指挥中心项目操作台柜系统设备、新排风以及自控设备配套及安装采购项目方案投标文件(技术方案)
- 2025年护理应急试题及答案
- 双重预防体系培训考核试题及答案
- 助产士考试题目及答案
- 换热器基础知识检测试题含答案
- 医院医疗废物管理培训考核试题(附答案)
- 考点解析-人教版八年级上册物理光现象《光的直线传播》定向测评试题(解析版)
- 妇产科医师三基三严试题(含参考答案)
- 《一级建造师之一建民航机场工程实务》资格考试真题附答案
- 绿色餐饮未来展望
- 2025杭州桐庐县统计局编外招聘2人考试参考题库及答案解析
- 扶贫项目实施方案及资金管理
- 2025中国华腾工业有限公司招聘笔试历年参考题库附带答案详解(3卷合一)
- 机械设计制造及其自动化专升本2025年智能设备联网试卷(含答案)
- 小学数学期末综合评价标准与表格
- 手术过程及准备流程
- 消防安全知识培训课件及考试题库
- 永久起搏器植入术课件
- 中国移动杭州市2025秋招笔试行测题库及答案通信技术类
- 卫生厅课题申报书范文
- 2025年甘肃省平凉市庄浪县第五幼儿园教育集团保健医招聘考试参考试题及答案解析
评论
0/150
提交评论