形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?

一. 形参与实参

1.先来一例子:

fun(int a)
{........}


Main ()

{
  int b=0;
  fun(b);

}
其中,a是形参,b是实参.

2.再看理论定义

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参变量也不能使用。
发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送。

函数的形参和实参具有以下特点:
1. 形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。
2. 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
3. 实参和形参在数量上,类型上,顺序上应严格一致,否则会发生类型不匹配”的错误。
4. 函数调用中发生的数据传送是单向的。即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。

二. 值传递与引用传递

1. 值传递:形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
2.引用传递: 就是传了内存空间的地址, 行参实参公用一个地址的数据, 当函数内部需要修改参数,也将同时改变影响调用者。

归结起来,call-by-value方式的调用参数和被调用方法中的参数,是两个变量,代表两个不同的内存地址;而call-by-reference方式的调用参数和被调用方法中的参数,代表的是同一内存地址。从这个意义上理解两种参数传递方式,就是很容易的了。
 传值的过程:
(1)形参与实参各占一个独立的存储空间。
(2)形参的存储空间是函数被调用时才分配的。调用开始,系统为行参开辟一个临时存储区,然后将各实参之值传递给形参,这时形参就得到了实参的值。
(3)函数返回时,临时存储区也被撤销。
    
    传值的特点:单向传递,即函数中对形参变量的操作不会影响到调用函数中的实参变量。 
    地址传递过程:参数是地址,实参和形参共享一个存储单元(也可以理解将实参的地址赋值给形参),对形参的操作相应的就改变了实参,此时参数传递是双向的。
 
    利用引用类型变量进行值传递:传递是原引用变量的副本,即把原引用变量复制一份传递给方法,使得方法中的行参和实参引用的值相同,指向同一个对象的实例;引用类型变量是以对象引用的形式传递的,是将要传递的对象的引用复制给函数的形参,这时形参是实参引用的复制,注意:是引用的复制,而不是原引用,和原引用指向相同的对象,因此对于引用对象所做的更改将会直接影响原来的值,但是对于引用本身,在函数内的任何改变将不会影响原引用。
    利用引用类型参数进行引用传递:传递的是引用变量的引用,此时形参相当于是实参的一个别名,两者是同一个引用。

三.ref参数与out参数

1.两者都是引用传递.

2.区别在于:ref参数在调用方法前必须几经初始化。而out参数在调用方法前可以没有初始化,他们都以引用传递方式传递。

四.参考兄弟的帖子.

http://blog.vsharing.com/janezhangxy/A1060907.html
http://blog.csdn.net/Zevin/article/details/5626863

作者:BobLiu
邮箱:lzd_ren@hotmail.com
出处:http://www.cnblogs.com/liuzhendong
本文版权归作者所有,欢迎转载,未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/liuzhendong/p/2118666.html