形参与实参, 值传递与引用传递, 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
?
總結
以上是生活随笔為你收集整理的形参与实参, 值传递与引用传递, ref参数与out参数的区别和联系?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 子网划分 超网、路由汇总计算
- 下一篇: BinaryStar代码分析前言