实参与形参的值传递问题?

实参与形参的值传递问题?

你一定看了本假书 :)

实参?不存在的。形参?不存在的。值传递?不存在的。地址传递?不存在的。引用传递?统统不存在的。

初学函数的你自信的码下这段代码

调用如下

是的,这个世界上很多东西不能强求就像爱情一样,冥冥之中似有巴意。你殷勤的敲下了39个字符,然而并没改变什么。你打算去书里寻找答案却被却被各种名词唬的团团转,你不由的对作者对编程产生了敬畏之心——“卧槽,还有这种操作?”,“卧槽?这也可以?”,敬畏之后剩下了的沮丧,这里妈一个函数调用就有这么多门道,隐隐觉得自己的编程生涯还没有开始就有可能药丸。

其实从swap(x,y)到swap(int a, int b)中间发生了什么?很简单的,发生了这么一件事情

于是整个调用链展开形式如下

结果就是,a和b顺利交换了,但是却不关x,y的事儿。懂了吗?那为什么swap的参数改成指针就可以了呢?我们依然用这个思路来分析。首先是函数

然后是调用方

用这个思路展开完整调用链

至此,为什么这种方式可以交换x和y应该一目了然了吧。因为我修改的是*a(注意星号),也就是指针指向的内容(*a指向的就是x!!!),而非a,并非指针本身。

接下来回归数组这个问题。依然是按照这个思路“展开”代码。

首先还是函数

然后调用方

展开

数组并不是一个基本类型,所以需要使用指针来描述它,这也是为什么数组名既是指针的原因。同样道理,A也好array也好他们都指向的是那块数组所在的内存,而指针加中括号的访问形式则代表直接取“内容”也就是指向的事物!这是这个问题中关于数组比较难的两个点——

1.A和array都是指针。

2.A[x]或者array[x]都是取“指向的内容”。

最后,让我们总结一下,实参x到形参a究竟发生了什么???一言以蔽之——发生了“a=x”的赋值操作!!!发生了赋值!!!至于那些恼人而唬人的概念,什么传递啊,统统见鬼去吧!

后注:当然书上说的那些并不是错的,但他们对于初学者的确不友好,明明一句代码能解释的非要整出一堆概念。同时,我说的也不一定是对的,在此,我分享我这一路走来的自己的理解和见解,包括我说的什么乱七八糟的形参实参,值传递,引用传递等等统统都是不存在的都是建立在我个人的见解层面上面。它不能帮助你正确的回答面试官的问题而拿到offer,但它能一定程度帮助你快速度过初学阶段而写出“心里有底”的代码。当你度过了初学阶段再回过头去看书,理解引用和值这些概念就水到渠成了。