Существует три основных параметра; указатель, ссылка и прямой.
Разница довольно проста: прямые параметры передаются по значению, а получатель получает копию того, что было передано; Это означает, что если параметр был изменен получателем, эти изменения не будут отражены обратно вызывающей стороне. (Это часто называется, достаточно соответственно, передачей по значению, или bycopy
.
Указатели также передаются по значению, но вместо того, чтобы отправлять фактическое значение, вызывающая сторона отправляет адрес значения. Это означает, что, следуя этому указателю, получатель может изменить аргумент. Обратите внимание, что изменения, внесенные в указатель фактический , по-прежнему не отражаются обратно для вызывающей стороны.
Окончательная форма, вызов по ссылке, является своего рода средним звеном между этими двумя подходами. По сути, его можно рассматривать как указатель, который выглядит как значение.
Стоит отметить, что в основе всего этого, параметры всегда передаются по значению, но разные языки имеют разные способы реализации ссылочной семантики (см. Ответ Kylotans).
// Example using C
// bycopy
int multiply(int x, int y) {
return x * y;
}
void multiply_p(int *x, int y) {
*x *= y;
}
int main () {
int i, j, k;
i = 20;
j = 10;
k = multiply(i,j); // k is now 200
multiply_p(&i, k); // i is now 4000 (200 * 20)
return 0;
}