© Miha Creative/Shutterstock.com
許多新手程序員想知道他們的編程語言是“按值傳遞”還是“按引用傳遞”語言。要了解您使用的是哪種語言,您必須首先了解這些術語的含義。
簡單地說,按值傳遞語言使用存儲在內存中的值的副本。傳遞引用語言引用內存中的實際值而不是創建副本。
讓我們看看按引用傳遞和按值傳遞語言之間的區別。
按值傳遞與按引用傳遞:並排比較
Pass-By-Value 與 Pass-By 比較-引用:有什麼區別?
現在,要記住的一件重要事情是,在這一點上,按值傳遞和按引用傳遞被認為是過時的區別。這意味著您不再需要擔心您的函數是按值傳遞還是按引用傳遞。了解它們之間的區別現在是深奧的知識,不會讓您在實際的編程應用程序中有太多用處。
今天仍在使用的許多語言被設計為使用按值傳遞或按-傳遞引用,並且可能具有其他功能來啟動按值傳遞或按引用傳遞。不過,您不再需要擔心您選擇的功能。它們現在在功能上是一樣的。
不過,了解按值傳遞和按引用傳遞之間的區別還是有一些用處的。那麼,讓我們來看看它們之間的功能差異。
調用函數
按值傳遞和按引用傳遞之間最顯著的區別是它們如何調用函數.調用函數使用用戶在代碼中提供的參數。我們將參數調用的函數稱為“被調用者”,調用參數的函數稱為“調用者”。調用者和被調用者傳遞的值稱為“實際參數”。函數接收的值稱為“形式參數”。
當使用按值傳遞時,在計算機內存中復制實際參數,然後將其作為形式參數傳遞給函數.對形式參數所做的任何更改只能被被調用者看到,而對調用者是不可見的,因為調用者和被調用者都有實際參數值的獨立副本。這也意味著對形式參數的更改不會更改內存中的實際參數。
按引用傳遞函數將引用計算機內存中的實際值。這意味著調用者和被調用者在引用內存中的該位置時使用相同的非獨立值。這也意味著對形式參數所做的任何更改對調用者和被調用者都是可見的,因為對形式參數的任何更改都將使用對內存中實際參數的引用進行。
何時使用按值傳遞
按值傳遞函數最適用於構建多線程應用程序。多線程應用程序最好使用按值傳遞的原因是,當應用程序使用按值傳遞時,它可以防止應用程序的其他線程修改函數使用的形式參數。假設其他線程可以修改你的形式參數。在這種情況下,當函數接收到錯誤的參數時,您將面臨函數中斷的風險。因此,按值傳遞信息允許每個線程使用獨立的形式參數,防止函數相互干擾。
此外,在分佈式應用程序中按值傳遞信息可以節省網絡開銷並允許它可以更有效地運行。如果你使用像 Java 這樣專注於按值傳遞的語言,你可能還需要按值傳遞。
雖然大多數現代語言都允許按值傳遞和按引用傳遞,但有些語言更喜歡其中一種。因此,您需要確保您選擇的語言支持您希望使用的函數調用。
根據您正在構建的內容和您的信息使用,可以使用按值傳遞或按引用傳遞。
©DC Studio/Shutterstock.com
何時使用引用傳遞
引用傳遞節省了複製值的開銷;程序不需要復制值,節省了處理時間。因此,在傳輸大量數據和結構時,如果可以的話,使用按引用傳遞的效率要高得多。
您隨時都想使用按引用傳遞使用調用函數修改實參。例如,此方法在需要更改調用函數中的參數值的應用程序中很有用。它在時間方面也更高效,因此可以使用額外時間的應用程序可能需要考慮通過引用傳遞。
使用 Java 的 swap() 和 changeValue() 函數演示按值傳遞
許多新手程序員想知道他們使用的語言主要使用按值傳遞還是按引用傳遞。 Java 是一種通常使用按值傳遞的語言,如果不總是使用的話。
我們將從為貓定義一個類開始,然後通過改變貓的顏色來演示按值傳遞。
public class Cat { private String color; public Cat() {} public Cat(String c) { this.color=c; } public String getColor() { 返回顏色; } public void setColor(String color) { this.color=color; } }
我們可以創建一個程序,使用 swap() 函數來改變貓的顏色,這樣兩個變量——內存中的變量和程序使用的副本——是不同的。
public class測試 { public static void main(String[] args) { Cat ginger=new Cat(“Ginger”);//內存引用=50 Cat calico=new Cat(“Calico”);//內存引用=100 swap(ginger, calico); System.out.println(“交換方法執行後:”); System.out.println(“`ginger` 顏色值=”+ red.getColor()); System.out.println(“`calico` 顏色值=”+ blue.getColor());變化值(印花布); System.out.println(“changeValue方法執行後:”); System.out.println(“`calico` 顏色值=”+ blue.getColor()); }//通用交換方法 public static void swap(Object o1, Object o2){ Object temp=o1; o1=o2; o2=溫度; } private static void changeValue(Cat cat) {//cat=100 cat.setColor(“ginger”);//cat=100 cat=new Cat(“tortiseshell”);//氣球=200 cat.setColor(“calico”);//balloon=200 } }
執行這段代碼會輸出如下內容:
swap 方法執行後:
‘ginger’color value=Ginger
‘calico’color value=Calico
changeValue 方法執行後:
‘calico’color value=Ginger
由於 swap() 方法沒有’更改原始值,僅更改值的副本,最終將兩個值列為相同的內存位置。
這個練習演示了 Java 通常使用按值傳遞方法。但是,您可以使用 changeValue() 函數更改存儲在內存中的值。
使用 C++ 的 swapnum() 演示按引用傳遞
我們可以使用以下命令演示按引用傳遞C++。 swapnum() 函數是修改通過引用傳遞的數據的示例。
#include void swapnum(int &i, int &j) { int temp=i;我=j; j=溫度; } int main(void) { int a=10;整數 b=20;交換數(a,b); printf(“A 是 %d,B 是 %d\n”, a, b);返回 0; }
執行此代碼將導致以下輸出:
A 為 20,B 為 10
此代碼作用於數據在內存中的位置,而不是創建數據的副本。因此,當代碼交換數字時,它會導致數據輸出發生變化以反映程序中數據的新位置,從而導致 A 和 B 的值在內存的基本級別交換。
Final Thoughts
按值傳遞和按引用傳遞可能是過時的概念。然而,覆蓋你的基礎並理解你正在使用的語言的內部陰謀仍然是好的。無論您使用的語言主要使用按值傳遞還是按引用傳遞,如果您了解自己想更好地使用哪種方法,就可以更快地訪問和修改參數。
某些語言(如 Java)可能只使用按值傳遞,但其他語言(如 C++)可能要求您按引用傳遞。因此,如果您打算學習多種語言,那麼理解這些概念是有道理的。
值傳遞與引用傳遞:有什麼區別? FAQs(常見問題)
什麼是按值傳遞?
按值傳遞是一種檢索存儲在計算機中的信息的方法
什麼是引用傳遞?
引用傳遞是一種檢索信息的方法通過直接引用數據在計算機內存中的位置來存儲在計算機內存中。
哪些語言主要使用按值傳遞?
Java是一種在從內存中檢索數據時幾乎完全使用按值傳遞的語言。
哪些語言主要使用按引用傳遞?
C++主要通過引用將數據從內存傳遞到程序。
按值傳遞是否比按引用傳遞更好?
在現代,這兩種函數類型幾乎是同義詞,不需要深入了解它們的區別。