按价值呼叫
在调用函数时,在程序堆栈上创建了新元素。这些包括有关函数的一些信息以及参数和返回值的空间(内存位置)。
将参数移交给函数时,已使用的变量(或文字)的值将复制到函数参数的内存位置。这意味着现在有两个具有相同值的内存位置。在函数内部,我们只处理参数内存位置。
在离开函数之后,弹出(删除)程序堆栈上的内存,这将擦除函数调用的所有数据,包括我们在内部使用的参数的内存位置。因此,函数内部更改的值不会影响外部变量值。
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
没有变化。图形并不完全准确,但强调了这个例子。
它被称为按值调用,因为我们不会移交变量,只会移交这些变量的值。