指针变量作为函数参数

指针变量作为函数参数

ID:17490778

大小:42.50 KB

页数:8页

时间:2018-09-02

上传者:U-2517
指针变量作为函数参数_第1页
指针变量作为函数参数_第2页
指针变量作为函数参数_第3页
指针变量作为函数参数_第4页
指针变量作为函数参数_第5页
资源描述:

《指针变量作为函数参数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

指针变量作为函数参数在谭浩强的c程序设计一书中,“指针变量作为函数参数”一节有这样一句话,菜鸟不甚理解,谁能帮我一下?“为了使在函数中改变了的值能被main函数所用,应该用指针变量作为函数参数,在函数执行过程中使指针变量所指向的变量值发生变化,函数调用结束后,这些变量值的变化依然保留下来。这样就实现了......”我想问的问题是:函数调用结束后,形参变量已不复存在,被释放了,为什么其值的变化依然保留下来?也就是说,为什么值的变化结果没有被释放?谢谢各位!看看下面的文章,或许你就明白了,:)C++中的引用【导读】介绍C++引用的基本概念,通过详细的应用分析与说明,对引用进行全面、透彻地阐述引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确、灵活地使用引用,可以使程序简洁、高效。引用简介引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符&引用名=目标变量名;【例1】:inta;int&ra=a; //定义引用ra,它是变量a的引用,即别名说明:(1)&在此不是求地址运算,而是起标识作用。(2)类型标识符是指目标变量的类型。(3)声明引用时,必须同时对其进行初始化。(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。ra=1;等价于a=1;(5)声明一个引用,不是新定义了一个变量,它只表示该引用名是目标变量名的一个别名,它本身不是一种数据类型,因此引用本身不占存储单元,系统也不给引用分配存储单元。故:对引用求地址,就是对目标变量求地址。&ra与&a相等。(6)不能建立数组的引用。因为数组是一个由若干个元素所组成的集合,所以无法建立一个数组的别名。引用应用1、引用作为参数引用的一个重要作用就是作为函数的参数。以前的C语言中函数参数传递是值传递,如果有大块数据作为参数传递的时候,采用的方案往往是指针,因为这样可以避免将整块数据全部压栈,可以提高程序的效率。但是现在(C++中)又增加了一种同样有效率的选择(在某些特殊情况下又是必须的选择),就是引用。【例2】:voidswap(int&p1,int&p2)//此处函数的形参p1,p2都是引用{intp;p=p1;p1=p2;p2=p;}为在程序中调用该函数,则相应的主调函数的调用点处,直接以变量作为实参进行调用即可,而不需要实参变量有任何的特殊要求。如:对应上面定义的swap函数,相应的主调函数可写为:main(){ inta,b; cin>>a>>b;//输入a,b两变量的值 swap(a,b);//直接以变量a和b作为实参调用swap函数 cout<floattemp;//定义全局变量tempfloatfn1(floatr); //声明函数fn1float&fn2(floatr);//声明函数fn2floatfn1(floatr)//定义函数fn1,它以返回值的方法返回函数值{ temp=(float)(r*r*3.14); returntemp;}float&fn2(floatr)//定义函数fn2,它以引用方式返回函数值{ temp=(float)(r*r*3.14); returntemp;}voidmain()//主函数{ floata=fn1(10.0);//第1种情况,系统生成要返回值的副本(即临时变量) float&b=fn1(10.0);//第2种情况,可能会出错(不同C++系统有不同规定) //不能从被调函数中返回一个临时变量或局部变量的引用 floatc=fn2(10.0);//第3种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 float&d=fn2(10.0);//第4种情况,系统不生成返回值的副本 //可以从被调函数中返回一个全局变量的引用 cout<>,这两个操作符常常希望被连续使用,例如:cout<<"hello"<int&put(intn);intvals[10];interror=-1;voidmain(){put(0)=10;//以put(0)函数值作为左值,等价于vals[0]=10; put(9)=20;//以put(9)函数值作为左值,等价于vals[9]=10;cout<=0&&n<=9)returnvals[n];else{cout<<"subscripterror";returnerror;}}(5)在另外的一些操作符中,却千万不能返回引用:+-*/四则运算符。它们不能返回引用,EffectiveC++[1]的Item23详细的讨论了这个问题。主要原因是这四个操作符没有sideeffect,因此,它们必须构造一个对象作为返回值,可选的方案包括:返回一个对象、返回一个局部变量的引用,返回一个new分配的对象的引用、返回一个静态对象引用。根据前面提到的引用作为返回值的三个规则,第2、3两个方案都被否决了。静态对象的引用又因为((a+b)==(c+d))会永远为true而导致错误。所以可选的只剩下返回一个对象了。4、引用和多态引用是除指针外另一个可以产生多态效果的手段。这意味着,一个基类的引用可以指向它的派生类实例。【例7】:class A;class B:publicA{……};B b;A &Ref=b;//用派生类对象初始化基类对象的引用Ref 只能用来访问派生类对象中从基类继承下来的成员,是基类引用指向派生类。如果A类中定义有虚函数,并且在B类中重写了这个虚函数,就可以通过Ref产生多态效果。引用总结(1)在引用的使用中,单纯给某个变量取个别名是毫无意义的,引用的目的主要用于在函数参数传递中,解决大块数据或对象的传递效率和空间不如意的问题。(2)用引用传递函数的参数,能保证参数传递中不产生副本,提高传递的效率,且通过const的使用,保证了引用传递的安全性。(3)引用与指针的区别是,指针通过某个指针变量指向一个对象后,对它所指向的变量间接操作。程序中使用指针,程序的可读性差;而引用本身就是目标变量的别名,对引用的操作就是对目标变量的操作。(4)使用引用的时机。流操作符<<和>>、赋值操作符=的返回值、拷贝构造函数的参数、赋值操作符=的参数、其它情况都推荐使用引用。阿蒙harry_meng@163.comhttp://www.vchome.net他的意思是这样的:intn=0;int*p=n;  //这个时候指针p里存的是n的地址.function(把指针p当作参数);你把指针当作参数传入后函数后,在函数里,那个指针存的就是你传进参数的地址,你利用指针改变这个地址的值,也就是改变了n的值.函数运行完,函数里的那个指针就被释放了,而n并没有释放,因为它的生命周期还没结束.VC++有点难~~~

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭