函数调用中的传值与传址

目录

      一、函数传值调用

      二、函数传址调用

      


      

一、函数传值调用

          在调用有参函数过程中,主调函数和被调函数之间有值的传递关系,系统会把实参的值传递给被调用函数的形参。或者说,形参从实参得到一个值,该值在函数调用期间有效,可以参加函数中的运算。

  下面来看这段代码:要求交换两个整形变量的值 

函数调用中的传值与传址_第1张图片

  这段代码执行结束后的结果却没有实现a与b的交换,交换后的结果依然是a=4、b=6。此时在来看下面的代码

函数调用中的传值与传址_第2张图片

    此时可以看出实参的值(a,b)即(4,6)确实传递给了形参(x,y)即x、y也分别拿到了4和6,那为什么没有交换呢?其实4和6是进行了交换的,x、y由原来的4和6变为了6和4。来再来看以下代码

函数调用中的传值与传址_第3张图片       

       此时x,y的值已经交换了,但是在看上面a和b的值依然是4和6,这就说明交换了的是x和y中的值,a,b并没有交换。   因为形参x,y中的4和6并不是实参a和b中的4和6,其实真正参与运算的是形参中的变量,通俗的讲x和y只是a和b的副本,就好比一份复印件,你在复印件上写写画画,但是你的原件依然是之前的样子。  也可以看上面a与b变量存储的地址 和x与y变量存储的地址是不一样的,这也说明了两者并不同。

       这时或许会有疑问,既然发生过交换为什么结果却没有交换?原因是在定义函数中(这里swap1)指定的形参,在未出现函数调用时,它们并不占内存中的存储单元。在发生调用时,函数swap1的形参才会被临时分配内存单元,在调用结束,形参单元被释放 (这里为x与y分配的空间在调用结束后被释放)。实参单元 (这里a和b)仍然保留并维持原值,没有改变。如果在执行一个被调用函数时,形参的值发生改变,不会改变主调函数的实参的值。实参和形参是两个不同的存储单元。

注意:实参向形参的数据传递是“值传递”,单向传递,只能由实参传给形参,而不能反过来。实参和形参在内存中占有不同的存储单元,实参无法得到形参的值。

函数调用中的传值与传址_第4张图片


二、函数传址调用

        传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。 这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。

  代码示例:

函数调用中的传值与传址_第5张图片

 这次把上面的“值传递”改成“址传递”,这时a、b的值就被交换了。来看下面的代码

函数调用中的传值与传址_第6张图片

       在这段程序中,首先输入a和b的值4、6,此时会把a的地址和b的地址传给pa和pb(pa和pb是指针变量,用来存放地址),pa和pb就分别存放了a和b的地址,从而就指向了a和b,从上面也可以看出 .如下图所示

        函数调用中的传值与传址_第7张图片     

 这时对pa和pb的操作就是直接对a和b进行操作


          

        

你可能感兴趣的:(c语言,c++)