这里我们直接接上一篇
看到这个自定义函数。我们传参的时候就会出现问题。这里就要涉及到实参和形参的区别了。通常大家可能都只是看看定义,噢知道了形参改变了,实参可以改。但是这样是错误的!!!
这里担心一些人会对后面的讲解模糊概念,放一下具体的定义再认识一下:
实际参数(实参):
真实传给函数的参数,叫实参。实参可以是:常量、变量、表达式、函数等。无论实参是何种类
型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
形式参数(形参):
形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配
内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在
函数中有效。
这里是一个可以交换两个整形变量的代码。上面Swap1和Swap2函数中的参数 x,y,px,py 都是形式参数。在main函数中传给Swap1的num1, num2和传给Swap2函数的&num1,&num2是实际参数。
好了这里就知道了,这里有两个不同形式的实现,有一种用到了指针,另外一种就是普通传参。那么swap1的打印结果是1 2而第二种是2 1。看到这,你可能会说,我知道我知道,这不就是形参是改变不了的吗。这话对一半,只对了 ’改变不了‘ 哈哈哈。我们要更深层的讲出为什么,就得用调试的路子了。这个我昨天写过了。好,现在我们打开监视看一下所谓形参和实参的区别。
可以看到,形参和实参,本质上,在系统内存中拥有的空间地位是相等的,等于实参和形参其实互不相干,所以你直接传值给函数的形参的时候,这是没有错的,错在我们最终打印的是原来的实参,实参并没有被改变,改变的其实是形参,也就是复印件。类似于我们要改合同,改了复印件不改原件,但是实际上,具有法律效益的还得是我们的原件,复印件只是一种拷贝。所以我们可以得出:形参实例化之后其实相当于实参的一份临时拷贝。所以我们的自定义函数,或者是cpp网站的函数后面的参数都用的是地址,这就是传址调用。而另外一种是传值调用。老规矩,这里还是放一下定义。防止阅读疲劳。
传值调用
函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。
传址调用
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起正真的联系,也就是函数内部可以直接操
作函数外部的变量。
好了这就是函数形参和实参的区别。本来想把递归和访问,调用,声明一起讲了的。但是写的又太多了,我秉持对每一个文字负责的态度也不想潦草敷衍过去,也想给大家再多写一些。那我们下次见,感谢观看!