按价值呼叫

在调用函数时,在程序堆栈上创建了新元素。这些包括有关函数的一些信息以及参数和返回值的空间(内存位置)。

将参数移交给函数时,已使用的变量(或文字)的值将复制到函数参数的内存位置。这意味着现在有两个具有相同值的内存位置。在函数内部,我们只处理参数内存位置。

在离开函数之后,弹出(删除)程序堆栈上的内存,这将擦除函数调用的所有数据,包括我们在内部使用的参数的内存位置。因此,函数内部更改的值不会影响外部变量值。

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 文档

它被称为按值调用,因为我们不会移交变量,只会移交这些变量的值。