函数的参数类型 指针和指针的引用的区别

其实归根结底就是传值传引用的区别,只不过涉及到指针,理解起来可能稍微复杂一点,大家可以先去看看传值和传引用方面的博文。

首先看一个简单的函数

函数的参数类型 指针和指针的引用的区别

在两个断点处,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这种管杀不管埋的行为,大家千万不要模仿!

 

上一篇:node.js 函数的调用


下一篇:Java8新特性---数组引用