ImageVerifierCode 换一换
格式:DOCX , 页数:10 ,大小:22.62KB ,
资源ID:16833774      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/16833774.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(指针数组和数组指针文档格式.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

指针数组和数组指针文档格式.docx

1、“下标表达式”不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。这就是堆的一个非常显著的特点,有的时候程序员本身都不知道要申请能够多少内存的时候,堆就变的格外有用。2、释放数组空间:delete 指向该数组的指针变量名;方括号非常重要的,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的,会产生回收不彻底的问题(只回收了第一个元素所占空间),我们通常叫它“内存泄露”,加了方括号后就转化为指向数组的指针,回收整个数组。delete 的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。上说过以前的delete 方括号中是必须添加个数的,后来由于很容易出

2、错,所以后来的版本就改进了这个缺陷。下面是个例子,VC上编译通过 #includeusing namespace std;/#include /for VC #include void main() int n;char *p;coutn; /n在运行时确定,可输入17 p=new charn; /申请17个字符(可装8个汉字和一个结束符)的内存空间strcpy(pc,“堆内存的动态分配”);/ pdelete p;/释放pc所指向的n个字符的内存空间return ; 通过指针使堆空间,编程中的几个可能问题 动态分配失败。返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。dat

3、a = new double m; /申请空间 if (data ) = 0) /或者=NULL 指针删除与堆空间释放。删除一个指针p(delete p;)实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除本身,释放堆空间后,成了空悬指针,不能再通过p使用该空间,在重新给p赋值前,也不能再直接使用p。内存泄漏(memory leak)和重复释放。new与delete 是配对使用的, delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,而这个时候又去释放的话,会导致一个很难查

4、出来的运行时错误。所以必须妥善保存new返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。动态分配的变量或对象的生命期。无名变量的生命期并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用。我们也称堆空间为自由空间(free store)就是这个原因。但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放是一件很容易失控的事,往往会出错,所以永远不要在函数体内申请空间,让调用者释放,这是一个很差的做法。你再怎么小心翼翼也可能会带来错误。类在堆中申请内存 :通过new建立的对象要调用构造函数,通过deletee删除对象要调用析构函数。C

5、Goods *pc;pc=new CGoods; /分配堆空间,并构造一个无名对象 /的CGoods对象;. delete pc;/先析构,然后将内存空间返回给堆;堆对象的生命期并不依赖于建立它的作用域,所以除非程序结束,堆对象(无名对象)的生命期不会到期,并且需要显式地用delete语句析构堆对象,上面的堆对象在执行delete语句时,C+自动调用其析构函数。正因为构造函数可以有参数,所以new后面类(class)类型也可以有参数。这些参数即构造函数的参数。但对创建数组,则无参数,并只调用缺省的构造函数。见下例类说明:class CGoods char Name21; int Amount;

6、 float Price; float Total_value;public:CGoods(); /缺省构造函数。因已有其他构造函数,系统不会再自动生成缺省构造,必须显式声明。CGoods(char* name,int amount ,float price) strcpy(Name,name);Amount=amount;Price=price;Total_value=price*amount; ;/类声明结束 下面是调用机制:CGoods *pc,*pc1,*pc2;pc=new CGoods(“hello”,10,118000);/调用三参数构造函数 pc1=new CGoods();/

7、调用缺省构造函数 ”输入商品类数组元素数”指向三维数组的指针;int (*b2) 20; /二级指针;b3=new int 1 20 30;b2=new int 30 20; 两个数组都是由600个整数组成,前者是只有一个元素的三维数组,每个元素为30行20列的二维数组,而另一个是有30个元素的二维数组,每个元素为20个元素的一维数组。 删除这两个动态数组可用下式:delete b3;/删除(释放)三维数组;delete b2;/删除(释放)二维数组;再次重申:这里的b2的类型是int (*) ,这样表示一个指向二维数组的指针。b3表示一个指向(指向二维数组的指针)的指针,也就是三级指针. (

8、 3 ) 二级指针的指针 看下例 :int (*p)2=new (int(*)3)2;p0=new int22;p1=new int22;p2=new int22;delete p0;delete p1;delete p2;delete p;注意此地方的指针类型为int (*),碰到这种问题就把外边的2先去掉,然后回头先把int * pnew int(*)n申请出来,然后再把外边的附加上去;p代表了一个指向二级指针的指针,在它申请空间的时候要注意指针的类型,那就是int (*)代表二级指针,而int (*)顾名思义就是代表指向二级指针的指针了。既然是指针要在堆里申请空间,那首先要定义它的范围:

9、(int(*)n)2,n 个这样的二级指针,其中的每一个二级指针的最低维是个元素.(因为要确定一个二级指针的话,它的最低维数是必须指定的,上边已经提到)。然后我们又分别为p0,p1,p2在堆里分配了空间,尤其要注意的是:在释放内存的时候一定要为p0,p1,p2,单独delete ,否则又会造成内存泄露,在deletep 的时候一定先delete p0; delete p1,然后再把给p申请的空间释放掉 delete p 这样会防止内存泄露。()指针的指针;int * cc=new (int*)10; 声明一个个元素的数组,数组每个元素都是一个int *指针,每个元素还可以单独申请空间,因为cc

10、的类型是int*型的指针,所以你要在堆里申请的话就要用int *来申请;看下边的例子 ( & GNU编译器都已经通过);int * a= new int * 2;/申请两个int * 型的空间 /为a的第二个元素又申请了个int 型空间,a1指向了此空间首地址处 a0=new int4;/为a的第一个元素又申请了个int 型空间,a0 指向了此空间的首地址处 int * b;a00=0;a01=1;b=a0;delete a0/一定要先释放a0,a1的空间,否则会造成内存泄露.;delete a1;delete a;b+;*b /随机数 注意:因为a 是在堆里申请的无名变量数组,所以在dele

11、te 的时候要用delete 来释放内存,但是a的每一个元素又单独申请了空间,所以在delete a之前要先delete 掉 a0,a1,否则又会造成内存泄露. () 指针数组: 我们再来看看第二种:二维指针数组 int *(*c)3=new int *32;如果你对上边的介绍的个种指针类型很熟悉的话,你一眼就能看出来c是个二级指针,只不过指向了一个二维int * 型的数组而已,也就是二维指针数组。例子:int *(*b)10=new int*210;b00=new int100;b01=new int100;*b00=1;cout *b00/打印结果为 delete b00;delete b

12、01;delete b;/打印随机数 这里只为大家还是要注意内存泄露的问题,在这里就不再多说了。如果看了上边的文章,大家估计就会很熟悉,这个b是一个二维指针,它指向了一个指针数组 第二种:int *d2;表示一个拥有两个元素数组,每一个元素都是int * 型,这个指向指针的指针:) d不管怎样变终究也是个数组,呵呵, 如果你读懂了上边的,那下边的声明就很简单了:d0=new int *10;d1=new int * 10;delete d0;delete d1;具体的就不再多说了 :二:函数指针 关于函数指针,我想在我们可能需要写个函数,这个函数体内要调用另一个函数,可是由于项目的进度有限,我

13、们不知道要调用什么样的函数,这个时候可能就需要一个函数指针;int a();这个一个函数的声明;ing (*b)();这是一个函数指针的声明;让我们来分析一下,左边圆括弧中的星号是函数指针声明的关键。另外两个元素是函数的返回类型(void)和由边圆括弧中的入口参数(本例中参数是空)。注意本例中还没有创建指针变量-只是声明了变量类型。目前可以用这个变量类型来创建类型定义名及用sizeof表达式获得函数指针的大小:unsigned psize = sizeof (int (*) (); 获得函数指针的大小 / 为函数指针声明类型定义 typedef int (*PFUNC) ();PFUNC是一个

14、函数指针,它指向的函数没有输入参数,返回int。使用这个类型定义名可以隐藏复杂的函数指针语法,就我本人强烈建议我们大内弟子使用这种方式来定义;下面是一个例子,一个简单函数指针的回调(在GNU编译器上通过,在VC上需要改变一个头文件就OK了) /GNU 编译器 g+ 实现 /* /vc 的实现 #include stdafx.h*/ #define DF(F) int F() this is in function #F return 0; /声明定义DF(F)替代 int F();函数;DF(a); DF(b); DF(c); DF(d); DF(e); DF(f); DF(g); DF(h)

15、; DF(i); /声明定义函数 a b c d e f g h i / int (*pfunc)();/一个简单函数指针的声明 typedef int(*FUNC)(); /一个函数指针类型的声明 FUNC ff = a,b,c,d,e,f,g,h,i; /声明一个函数指针数组,并初始化为以上声明的a,b,c,d,e,f,g,h,i函数 FUNC func3(FUNC vv) /定义函数func3,传入一个函数指针,并且返回一个同样类型的函数指针 vv(); return vv;/*FUNC func4(int (*vv)() /func3的另一种实现 */ int main() for(i

16、nt i=0;isizeof(ff)/sizeof (FUNC);i+) /循环调用函数指针 FUNC r=func3(ff i ); coutr()/输出返回值,只是返回了0 到目前为止,我们只讨论了函数指针及回调而没有去注意ANSI C/C+的编译器规范。许多编译器有几种调用规范。如在Visual C+中,可以在函数类型前加_cdecl,_stdcall或者_pascal来表示其调用规范(默认为_cdecl)。C+ Builder也支持_fastcall调用规范。调用规范影响编译器产生的给定函数名,参数传递的顺序(从右到左或从左到右),堆栈清理责任(调用者或者被调用者)以及参数传递机制(堆

17、栈,CPU寄存器等)。好了,先到此为止吧,写这篇文章耗费了基本上快半天的时间了,很多事情还没有做,等改天有时间再回来整理,所有的源程序都放在openlab3服务器上我的目录下lib/cpp下,大家可以去拿。不知道的登陆openlab3 然后cd chengx/lib/cpp就可以看到了。还有很复杂的声明可能也是一种挑战 比如里的 int (*(*f4()10();的声明,f4是一个返回指针的函数,该指针指向了含有10个函数指针的数组,这些函数返回整形值;不是这个函数有特别之处,而是Bruce Eckel 说的“从右到左的辨认规则”是一种很好的方法,值得我们去学习,感谢他:最后我想应该跟大家说一下,写程序应该就象JERRY所说的:简单就是美;我们应该遵循一个原则 : KISS (Keep It Simple,Stupid ,尽量保持程序简单 出自 :Practical C programming),把自己的程序尽量的简单明了,这是个非常非常好的习惯。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1