关于指针作为函数参数传递的理解

本来已经把指针和引用的知识都捋清楚了,但是中午编程遇到了一个传递数组的问题,一下想得多了点,然后又。。。。

被值传递,指针传递,引用传递,地址传递这几个概念弄晕了。看了十来篇博客,什么说法都有。参考课本和菜鸟教程还有一些优秀博客上的观点,加上自己实操,得出下面一些自己对指针传递的理解。

以下是本人粗浅理解,不知是否表述清晰,若有疑问或高见,请在评论区留言指正。

见代码:

 关于指针作为函数参数传递的理解_第1张图片

 

 

见运行结果:

关于指针作为函数参数传递的理解_第2张图片

“在习惯上,很多情况下指针和地址这两个术语可以混用” ----摘自《C语言程序设计》蓝皮书

由上面运行结果分析得知:

实质上指针传递传递的是一个地址值,但是到底是说成值传递,还是地址传递,很多博客和网上的答疑中回答不一,但我更倾向于前者,是值的传递。

分析上面的程序:

1.传递的实参是一个地址,即指针;

2.函数中用一个指针变量b接收实参指针;

3.输出 形参指针存的值 和 实参变量的值进行对比,发现是一样的;

4.但是输出 形参指针本身的地址,和实参变量的值(即实参指针&a),发现是不一样的,说明形参指针b,和实参指针&a是两个独立的指针,只不过 形参指针b,是(实参变量)实参指针&a的一个副本(拷贝)【被调函数的形参作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从而形成了实参的一个副本(替身)】

指针b中存的值是&a,但是指针b它本身是一个另外独立存在的指针,它的自己本身的地址肯定会跟&a不一样的,都不是同一个东西。这就是和 引用传递 的关键区别所在。

5.但是形参指针变量b 它存储了实参变量传过来的地址&a,自然就会指向&a这个地址指向的值a(初始化为10)。因此,在函数中输出形参指针变量指向的变量的值,就发现就是10.

6.在改变了形参指针变量b所指的变量的值后,改成999,输出后可以发现,也会改变原来地址&a中存的变量值,因为b和&a指向的是同一块地址。

7.但是在函数中改变b存储的地址,改变它的指向,这个对实参是没有影响的,根据输出可以发现,b变了,但&a还是没有变。因为形参指针和实参指针是两个独立的指针,改变其中一个的指向对另外一个没有影响。

综上,得出总结:

形参指针和实参指针是两个独立的指针,形参指针是实参指针的副本,他们指向的地址是一模一样的,因此通过他们其中任何一个改变他们指向的变量的值,这个值都会改变(本来两个指针变量指向的变量的值是10 ,后来通过修改形参指针指向的变量值,改成999,两个指针变量指向的变量的值都变成了999);但是,改变形参本身存储的地址值,这个对实参变量是没有影响的,不过就是你形参不和我实参指向同一块地址了而已。

即:除了引用传递是地址传递外,普通变量的传递,指针传递,都是值传递。

 

*****************************************************************************************************************************

根据优秀博客中的论述,关于指针传递和引用传递可有以下理解:

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)

而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址(int &a的形式)。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用传递和指针传递是不同的,虽然它们都是在被调函数栈空间上的一个局部变量,但是任何对于引用参数的处理都会通过一个间接寻址的方式操作到主调函数中的相关变量。而对于指针传递的参数,如果改变被调函数中的指针地址,它将影响不到主调函数的相关变量。如果想通过指针参数传递来改变主调函数中的相关变量,那就得使用指向指针的指针,或者指针引用。

**************************************************************

算了,上面这篇博客写得太好了,太多想粘贴的了,我还是直接上链接吧:

传指针和传指针引用的区别/指针和引用的区别(本质)

https://www.cnblogs.com/x_wukong/p/5712345.html

这篇博客也是转载了别人的,可以点击这篇博客的上方链接去看原汁原味的博客。

 

还有一篇直接将讲:C++函数的参数三种传值方式为:值传递、地址传递(指针传递,引用传递)

https://blog.csdn.net/liang841451955/article/details/80241074

 

还有一篇也不错:详解c++指针的指针和指针的引用

https://www.cnblogs.com/li-peng/p/4116349.html

 

此外,附上菜鸟教程的C++指针教程链接:很适合我这种水平的菜鸟巩固基础。

http://www.runoob.com/cplusplus/cpp-pointers.html

******************************************************************************************************************************

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(C++)