Upon calling a function there are new elements created on the program stack. These include some information about the function and also space (memory locations) for the parameters and the return value.
When handing over a parameter to a function the value of the used variable (or literal) is copied into the memory location of the function parameter. This implies that now there a two memory locations with the same value. Inside of the function we only work on the parameter memory location.
After leaving the function the memory on the program stack is popped (removed) which erases all data of the function call, including the memory location of the parameters we used inside. Thus, the values changed inside the function do not affect the outside variables values.
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
}
In this code we create variables inside the main function. These get assigned values. Upon calling the functions there are two new variables created: f
and inner_b
where b
shares the name with the outer variable it does not share the memory location. The behaviour of a<->f
and b<->b
is identical.
The following graphic symbolizes what is happening on the stack and why there is no change in varibale b
. The graphic is not fully accurate but emphazises the example.
It is called "call by value" because we do not hand over the variables but only the values of these variables.