




已阅读5页,还剩26页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第三节、数组与指针,目标:1一维数组与指针2数组越界3指针和堆的内存分配4丢失指针,一、一维数组与指针,1、什么是数组?数组是一组数据存储单元,每个单元保存相同数据类型,每个存储单元成为数组的一个元素。2、什么是指针?指针是一个变量,它保存了一个变量的地址。首先我们看一下下面的例子:chara10,*p;p=a;,p是一个char类型的指针,它里面放的是数组a的首地址,即a0;a这里有双重含义:地址,也可以看作是常量指针;里面包含了10个char元素。在这种情况下,指针可以完成数组的操作,例如,对于数组的访问,可以用指针进行,也可以像数组一样对数组单元赋值和取址。但是数组不能看做普通指针,应该理解成一个固定的地址,她是在编译期间确定的,也可以理解成常量指针。但是,由于数组名的双重含义,决定了他自己的特性,不信请看下面的程序:,#include#includeusingnamespacestd;intmain(intargc,char*argv)inta10=1,2,3,4,5,6,7,8,9,10,*p;p=a;coutaendl;coutn;/n在运行时确定,可输入17p=newcharn;/申请17个字符(可装8个汉字和一个结束符/)的内存空间strcpy(pc,“堆内存的动态分配”);/coutp指向三维数组的指针;int(*b2)20;/二级指针;b3=newint12030;b2=newint3020;两个数组都是由600个整数组成,前者是只有一个元素的三维数组,每个元素为30行20列的二维数组,而另一个是有30个元素的二维数组,每个元素为20个元素的一维数组。,删除这两个动态数组可用下式:deleteb3;/删除(释放)三维数组;deleteb2;/删除(释放)二维数组;再次重申:这里的b2的类型是int(*),这样表示一个指向二维数组的指针。b3表示一个指向(指向二维数组的指针)的指针,也就是三级指针.(3)二级指针的指针看下例:参见example1。int(*p)2=(int(*)2)newint*32;p0=newint22;p1=newint22;p2=newint22;deletep0;deletep1;deletep2;deletep;,注意:此地方的指针类型为int(*),碰到这种问题就把外边的2先去掉,然后回头先把int*pnewint*n申请出来,然后再把外边的附加上去;p代表了一个指向二级指针的指针,在它申请空间的时候要注意指针的类型,那就是int(*)代表二级指针,而int(*)顾名思义就是代表指向二级指针的指针了。既然是指针要在堆里申请空间,那首先要定义它的范围:(int*n)2,n个这样的二级指针,其中的每一个二级指针的最低维是个元素.(因为要确定一个二级指针的话,它的最低维数是必须指定的,上边已经提到)。然后我们又分别为p0,p1,p2在堆里分配了空间,尤其要注意的是:在释放内存的时候一定要为p0,p1,p2,单独delete,否则又会造成内存泄露,在deletep的时候一定先deletep0;deletep1,然后再把给p申请的空间释放掉deletep这样会防止内存泄露。,()指针的指针;int*cc=newint*10;声明一个个元素的数组,数组每个元素都是一个int*指针,每个元素还可以单独申请空间,因为cc的类型是int*型的指针,所以你要在堆里申请的话就要用int*来申请;看下边的例子:int*a=newint*2;/申请两个int*型的空间a1=newint3;/为a的第二个元素又申请了个int型空间,a1指向了此空间首地址处a0=newint4;/为a的第一个元素又申请了个int型空间,a0指向了此空间的首地址处int*b;a00=0;a01=1;b=a0;deletea0/一定要先释放a0,a1的空间,否则会造成内存泄露.;deletea1;deletea;b+;cout*bendl;/随机数,注意:因为a是在堆里申请的无名变量数组,所以在delete的时候要用delete来释放内存,但是a的每一个元素又单独申请了空间,所以在deletea之前要先delete掉a0,a1,否则又会造成内存泄露.()指针数组:我们再来看看第二种:二维指针数组int*(*c)3=newint*33;如果你对上边的介绍的个种指针类型很熟悉的话,你一眼就能看出来c是个二级指针,只不过指向了一个二维int*型的数组而已,也就是二维指针数组。例子:int*(*b)10=newint*210;/b00=newint100;b01=newint100;*b00=1;cout*b00endl;/打印结果为deleteb00;deleteb01;deleteb;cout*b00endl;/打印随机数,这里只为大家还是要注意内存泄露的问题,在这里就不再多说了。如果看了上边的内容,大家估计就会很熟悉,这个b是一个二维指针,它指向了一个指针数组第二种:int*d2;表示一个拥有两个元素数组,每一个元素都是int*型,这个指向指针的指针。d不管怎样变终究也是个数组,呵呵,如果你读懂了上边的,那下边的声明就很简单了:d0=newint*10;d1=newint*10;deleted0;deleted1;具体的就不再多说了:),四、丢失的指针,看下面的例子:#includeiostream.hvoidmain()int*pint=newint;*pint=10;cout*pint*pintendl;deletepint;*pint=0;long*plong=newlong;*plong=90000;cout*plong*plongendl;*pint=20;cout*pint*pintendl;cout*plong*plongendl;deleteplong;,结果:10900002020分析原因:/最后一句:,很关键。它的作用是把指针保存的内容清零。程序开始给指针pint分配内存,当deletepint后pint分配的内存区域被收回。此时指针plong被分配内存,其被分配的区域为刚刚被删除的pint的内存区域。所以当pint重新赋值的时候,就覆盖了plong的值。,指针总结:1)指针自身是一个变量,它有自己的存储空间。2)指针new申请空间,是指在堆里申请一块内存,并把首地址保存到指针变量空间。3)指针delete,是释放在堆里申请的那块空间。此时,指针的存储空间还保存着被释放的堆内存的首地址。由于指针的记忆没有清除,因此通过指针的仍然可以访问被释放的堆内存。,所以通常我们在使用完指针后,除了delete外,还要记住把指针变量保存的地址清空。例如:int*p=newint100;deletep;P=NULL;最后一句的作用就是把指针的记忆清除。否则就容易造成指针丢失。,本章总结1一维数组与指针2数组越界3指针和堆的内存分配4丢失指针,课堂练习参见
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年综合类-临床医学检验技术(士)-血栓与止血的基本理论历年真题摘选带答案(5套单选100题合辑)
- 2025年综合类-临床医学检验技术(士)-体液免疫球蛋白测定历年真题摘选带答案(5卷单选题百道集合)
- 2025年综合类-中西医结合执业医师-基本操作历年真题摘选带答案(5卷单选100题合辑)
- 2025年综合类-中学教育知识与能力-第六章中学生心理辅导历年真题摘选带答案(5卷单选题百道集合)
- 宿州小区门岗管理办法
- 安全交易综合管理办法
- 大型外企采购管理办法
- 员工基金使用管理办法
- 家庭寄养宠物管理办法
- 后勤大楼管理管理办法
- DB37-T 2401-2022危险化学品岗位安全生产操作规程编写导则
- 2023年小学科学教师招聘考试真题练习试题卷及参考答案
- 转包违法分包等违法行为认定查处管理办法讲座课件
- 劳资专管员任命文件(样本)
- 哔哩哔哩认证公函
- 托玛琳养生碗gg课件
- 水产养殖示范基地建设项目实施方案
- 行政后勤人员 三级安全教育培训记录卡
- 河北省张家口市各县区乡镇行政村村庄村名居民村民委员会明细
- 消化系统炎症性肠病labc
- DB52∕T 1480-2019 GLW-8430连栋塑料薄膜温室通用技术规范
评论
0/150
提交评论