Примеры взяты из здесь .
Основной код:
#include <stdio.h>
int a;
int main() {
a = 3;
f( 4, &a );
printf("%d\n", a);
return 0;
}
Вызов по значению:
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but now nothing is done with x anymore
a += 2*y;
// a is still 3 so the result is 11
}
Значение передается и не влияет на значение переменной, переданной.
Позвоните по ссылке:
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but because & is used x is the same as a
// meaning if you change x it will change a
a += 2*y;
// a is now 6 so the result is 14
}
Передается ссылка. Фактически переменная в функции такая же, как и внешняя.
Вызов с копированием / восстановлением:
int a;
void unsafe(int x) {
x= 2; //a is still 1
a= 0; //a is now 0
}//function ends so the value of x is now stored in a -> value of a is now 2
int main() {
a= 1;
unsafe(a); //when this ends the value of a will be 2
printf("%d\n", a); //prints 2
}
Значение передается и не влияет на значение переменной, переданной в конец функции, после чего окончательное значение переменной функции сохраняется в переданной переменной.
Основное различие между вызовом по ссылке и копированием / восстановлением заключается в том, что изменения, внесенные в переменную функции, не будут отображаться в переданной переменной до тех пор, пока не завершится функция, а изменения вызова по ссылке будут видны немедленно. 1029 *