1. 程式人生 > >傳引用呼叫與傳值呼叫

傳引用呼叫與傳值呼叫

昨天做到一個題一臉懵逼。

以下關於傳值呼叫與傳引用呼叫的敘述中,正確得是()。
① 在傳值呼叫方式下,可以實現形參和實參間雙向傳遞資料的效果
② 在傳值呼叫方式下,實參可以是變數,也可以是常量和表示式
③ 在引用呼叫方式下,可以實現形參和實參間雙向傳遞資料的效果
④ 在引用呼叫方式下,實參可以是變數,也可以是常量和表示式

答案為 ②③

所以,要搞懂這個首先要知道形參和實參

實參與形參

實參(argument):
全稱為”實際引數”是在呼叫時傳遞給函式的引數. 實參可以是常量、變數、表示式、函式等, 無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。

形參(parameter):
全稱為”形式引數” 由於它不是實際存在變數,所以又稱虛擬變數。是在定義函式名和函式體的時候使用的引數,目的是用來接收呼叫該函式時傳入的引數.在呼叫函式時,實參將賦值給形參。因而,必須注意實參的個數,型別應與形參一一對應,並且實參必須要有確定的值。

形參和實參的區別

形參出現在函式定義中,在整個函式體內都可以使用, 離開該函式則不能使用。
實參出現在主調函式中,進入被調函式後,實參變數也不能使用。
形參和實參的功能是作資料傳送。發生函式呼叫時, 主調函式把實參的值傳送給被調函式的形參從而實現主調函式向被調函式的資料傳送。
1.形參變數只有在被呼叫時才分配記憶體單元,在呼叫結束時, 即刻釋放所分配的記憶體單元。

因此,形參只有在函式內部有效。 函式呼叫結束返回主調函式後則不能再使用該形參變數。
2.實參可以是常量、變數、表示式、函式等, 無論實參是何種型別的量,在進行函式呼叫時,它們都必須具有確定的值, 以便把這些值傳送給形參。 因此應預先用賦值,輸入等辦法使實參獲得確定值。
3.實參和形參在數量上,型別上,順序上應嚴格一致, 否則會發生“型別不匹配”的錯誤。
4.函式呼叫中發生的資料傳送是單向的。 即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。 因此在函式呼叫過程中,形參的值發生改變,而實參中的值不會變化。
5.當形參和實參不是指標型別時,在該函式執行時,形參和實參是不同的變數,他們在記憶體中位於不同的位置,形參將實參的內容複製一份,在該函式執行結束的時候形參被釋放,而實參內容不會改變。
而如果函式的引數是指標型別變數,在呼叫該函式的過程中,傳給函式的是實參的地址,在函式體內部使用的也是實參的地址,即使用的就是實參本身。
所以在函式體內部可以改變實參的值。

傳值與引用

  1. 傳值呼叫又分為資料傳值呼叫和地址傳值呼叫。 資料傳值呼叫方式是將實參的資料值傳遞給形參。
    實參和形參在棧空間內的地址不相同,改變形參值不影響實參值; 地址傳值呼叫方式是將實參的地址值傳遞給形參,
    實參和形參在棧空間內共用同一地址,改變形參值就可改變實參值。
  2. 引用呼叫是將實參變數值傳遞給形參, 而形參是實參變數的引用名。引用是給一個已有變數起的別名,
    對引用的操作就是對該已有變數的操作。 引用呼叫可以起到地址傳值呼叫的作用, 即改變形參值就可改變實參值。引用呼叫比地址傳值呼叫更為簡單,