按引用傳遞

通過引用調用(也稱為引用傳遞)是一種評估策略,其中函式接收對用作參數的變數的隱式引用,而不是其值的副本。這通常意味著該函式可以修改(即分配給)用作參數的變數 - 其調用者將看到的內容。因此,可以使用引用呼叫在被叫功能和呼叫功能之間提供附加的通信信道。調用引用語言使程式設計師更難以跟蹤函式調用的效果,並可能引入細微的錯誤。

基本介紹

  • 中文名:按引用傳遞
  • 外文名:Call by reference
介紹,例子,按引用傳遞的重要特點,

介紹

許多語言以某種形式支持通過引用調用,但相對較少的語言將其用作默認值。 FORTRAN II是參考調用語言的早期示例。一些語言,如C ++,PHP,Visual Basic .NET,C#和REALbasic,默認按值調用,但為調用引用參數提供特殊語法。 C ++還提供了對const的引用調用。 Rust還提供了引用調用,但默認為不可變(const)引用。可變引用具有與不可變引用類似的語法。
通過引用調用可以使用按值調用的語言進行模擬,並且不完全支持通過引用調用,通過使用引用(引用其他對象的對象),例如指針(表示其他對象的記憶體地址的對象) 。 C和ML等語言使用這種技術。它不是一個單獨的評估策略-語言按值調用-但有時它被稱為按地址調用(也稱為按地址傳遞)。在ML中,參考文獻是類型和記憶體安全的。
通過共享調用(傳遞一個可以隨後變異的對象)來實現類似的效果,在Java,Python和Ruby等語言中使用。
在純函式式語言中,兩種策略之間通常沒有語義差異(因為它們的數據結構是不可變的,因此函式不可能修改其任何參數),因此它們通常被描述為按值調用,即使實現經常在內部使用引用來提高效率。

例子

以下示例演示了E中的引用調用:
def modify(var p, &q) {    p := 27 # passed by value: only the local parameter is modified    q := 27 # passed by reference: variable used in call is modified}? var a := 1# value: 1? var b := 2# value: 2? modify(a, &b)? a# value: 1? b# value: 27
以下是一個按地址調用的示例,它模擬C中的引用調用:
void modify(int p, int* q, int* r) {    p = 27; // passed by value: only the local parameter is modified    *q = 27; // passed by value or reference, check call site to determine which    *r = 27; // passed by value or reference, check call site to determine which}int main() {    int a = 1;    int b = 1;    int x = 1;    int* c = &x;    modify(a, &b, c); // a is passed by value, b is passed by reference by creating a pointer (call by value),                    // c is a pointer passed by value                    // b and x are changed    return 0;}

按引用傳遞的重要特點

傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個記憶體空間)。
示例如下:
public class TempTest {  private void test1(A a){  a.age = 20;  System.out.println("test1方法中的age="+a.age);  }  public static void main(String[] args) {  TempTest t = new TempTest();  A a = new A();  a.age = 10;  t.test1(a);  System.out.println(”main方法中的age=”+a.age);  }  }  class A{  public int age = 0;  }  
運行結果如下:
test1方法中的age=20  main方法中的age=20  

相關詞條

熱門詞條

聯絡我們