按價值呼叫
在呼叫函式時,在程式堆疊上建立了新元素。這些包括有關函式的一些資訊以及引數和返回值的空間(記憶體位置)。
將引數移交給函式時,已使用的變數(或文字)的值將複製到函式引數的記憶體位置。這意味著現在有兩個具有相同值的記憶體位置。在函式內部,我們只處理引數記憶體位置。
在離開函式之後,彈出(刪除)程式堆疊上的記憶體,這將擦除函式呼叫的所有資料,包括我們在內部使用的引數的記憶體位置。因此,函式內部更改的值不會影響外部變數值。
int func(int f, int b) {
//new variables are created and values from the outside copied
//f has a value of 0
//inner_b has a value of 1
f = 1;
//f has a value of 1
b = 2;
//inner_b has a value of 2
return f+b;
}
int main(void) {
int a = 0;
int b = 1; //outer_b
int c;
c = func(a,b);
//the return value is copied to c
//a has a value of 0
//outer_b has a value of 1 <--- outer_b and inner_b are different variables
//c has a value of 3
}
在這段程式碼中,我們在 main 函式中建立變數。這些獲得指定的值。在呼叫函式時,建立了兩個新變數:f
和 inner_b
,其中 b
與外部變數共享名稱,它不共享記憶體位置。a<->f
和 b<->b
的行為是相同的。
下圖說明了堆疊上發生的事情以及為什麼 varibale b
沒有變化。圖形並不完全準確,但強調了這個例子。
它被稱為按值呼叫,因為我們不會移交變數,只會移交這些變數的值。