按價值呼叫

在呼叫函式時,在程式堆疊上建立了新元素。這些包括有關函式的一些資訊以及引數和返回值的空間(記憶體位置)。

將引數移交給函式時,已使用的變數(或文字)的值將複製到函式引數的記憶體位置。這意味著現在有兩個具有相同值的記憶體位置。在函式內部,我們只處理引數記憶體位置。

在離開函式之後,彈出(刪除)程式堆疊上的記憶體,這將擦除函式呼叫的所有資料,包括我們在內部使用的引數的記憶體位置。因此,函式內部更改的值不會影響外部變數值。

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 函式中建立變數。這些獲得指定的值。在呼叫函式時,建立了兩個新變數:finner_b,其中 b 與外部變數共享名稱,它不共享記憶體位置。a<->fb<->b 的行為是相同的。

下圖說明了堆疊上發生的事情以及為什麼 varibale b 沒有變化。圖形並不完全準確,但強調了這個例子。 StackOverflow 文件

它被稱為按值呼叫,因為我們不會移交變數,只會移交這些變數的值。