其实归根结底就是传值和传引用的区别,只不过涉及到指针,理解起来可能稍微复杂一点,大家可以先去看看传值和传引用方面的博文。
首先看一个简单的函数
在两个断点处,p1的值分别为
和
然后自己随手写一个函数fun1,在主函数里调用它
我们原本期望的是:通过fun1函数申请一份存放int的内存,然后让传进fun1函数的指针指向刚刚申请的内存。
可是最终在两个断点处的结果却是这样的:
在执行fun1函数后,p1的值依旧为空,也就是说我们的期望没有成功。
要想实现我们的原本期望,可以分为两步:
第一步:new 一个内存
第二步:让指针指向我们刚刚 new出来的内存。
实际上,fun1函数确实 new 了一个内存,但是却没有做到让我们传进去的指针指向 new 出来的内存,所以 p1指针的值才没有改变(p1的值即为p1所指向的内存的地址)。
这是为什么呢?
这里就涉及到形参和实参、传值和传引用的概念了:
简而言之,当我们函数的参数类型不是引用时,当我们将实参(上面主函数的p1)传进去函数时,函数的形参(fun1函数中的p)的值是通过对实参的复制得到的,即此时形参的值和实参的值是相同的,都为空,但是他们两个是不同的东西,
仅仅指向同一块内存而已,除此之外,没有任何联系。
然后,执行fun1函数体中的new语句,此时的效果是让形参p指向了new出来的内存,和你实参(p1)没有半毛钱关系,p1原本是啥现在还是啥。
我们可以在fun1函数里打一个断点进行验证一下:
刚开始时:p1和p的值相同。
可以看到形参p的值确实改变了。
然后再谈谈传引用:当函数的参数为引用类型时,当实参传进函数时,形参不再是仅仅进行一个简单的复制,形参直接成了实参的别名,也就是说此时形参和实参就是一个东西,你对形参的操作,都会实时的反映到实参身上。我们可以写一个fun2函数,将函数参数类型设置为引用类型,就能达到想到的效果了,如图:
ps:上面的代码我都仅仅new了一下,但是没有delete,这种管杀不管埋的行为,大家千万不要模仿!