程式設計基礎/傳值呼叫與傳引用呼叫
外觀
< 程式設計基礎
在傳值呼叫中,引數在函式中充當一個新的區域性變數,初始化為引數的值(引數的區域性(隔離)副本)。在傳引用呼叫中,呼叫者提供的引數變數可能會受到被呼叫函式中操作的影響。[1]
在大多數當前程式語言中,引數預設情況下按值傳遞,引數為呼叫值的副本。引數是隔離的,函式可以自由地更改引數值,而不會對呼叫函式產生任何影響。考慮以下虛擬碼
Function Main
Declare Real fahrenheit
Assign fahrenheit = 100
Output "Main fahrenheit = " & fahrenheit
Call ChangeFahrenheit(fahrenheit)
Output "Main fahrenheit = " & fahrenheit
End
Function ChangeFahrenheit (Real fahrenheit)
Output "ChangeFahrenheit fahrenheit = " & fahrenheit
Assign fahrenheit = 0
Output "ChangeFahrenheit fahrenheit = " & fahrenheit
End
Main fahrenheit = 100 ChangeFahrenheit fahrenheit = 100 ChangeFahrenheit fahrenheit = 0 Main fahrenheit = 100
用英文來說,Main 函式將值 100 賦值給變數 fahrenheit,顯示該值,然後呼叫 ChangeFahrenheit 傳遞該值的副本。被呼叫函式顯示引數,更改引數,然後再次顯示引數。執行返回呼叫函式,Main 顯示原始變數的值。在傳值呼叫中,呼叫函式中的變數 fahrenheit 和被呼叫函式中的引數 fahrenheit 引用不同的記憶體地址,被呼叫函式無法更改呼叫函式中變數的值。
如果程式語言使用或支援傳引用呼叫,則呼叫函式中的變數和被呼叫函式中的引數引用相同的記憶體地址,被呼叫函式可以更改呼叫函式中變數的值。使用與上面相同的程式碼示例,傳引用呼叫的輸出將更改為
Main fahrenheit = 100 ChangeFahrenheit fahrenheit = 100 ChangeFahrenheit fahrenheit = 0 Main fahrenheit = 0
支援傳值呼叫和傳引用呼叫的程式語言使用某種型別的關鍵字或符號來指示正在使用哪種引數傳遞方法。
| 語言 | 傳值呼叫 | 傳引用呼叫 |
|---|---|---|
| C++ | 預設 | 在被呼叫函式中使用 ¶meter |
| C# | 預設 | 在呼叫和被呼叫函式中使用 ref parameter |
| Java | 預設 | 適用於陣列和物件 |
| JavaScript | 預設 | 適用於陣列和物件 |
| Python | 預設 | 適用於陣列(列表)和可變物件 |
陣列和物件將在後面的章節中介紹。
- 傳引用呼叫
- 呼叫函式傳遞的引數可以被被呼叫函式修改。
- 傳值呼叫
- 呼叫函式傳遞的引數不能被被呼叫函式修改。
