Разница между значением параметра и опорным параметром? - PullRequest
5 голосов
/ 05 февраля 2010

Разница между значением параметра и опорным параметром? Этот вопрос иногда задают интервьюеры во время моих интервью. Может кто-нибудь сказать мне точную разницу, которую легко объяснить на примере? И ссылочный параметр и параметр указателя - это одно и то же?

Спасибо

Ответы [ 7 ]

14 голосов
/ 05 февраля 2010

Изменения в параметре значения не видны вызывающей стороне (также называемой «передачей по значению»).

Изменения в ссылочном параметре видны вызывающей стороне («передача по ссылке»).

C ++ пример:

void by_value(int n) { n = 42; }
void by_ref(int& n) { n = 42; }

void also_value(int const& n); // Even though a reference is used, this is
// semantically a value parameter---though there are implementation
// artifacts, like not being able to write "n = 42" (it's const) and object
// identity (&n here has different ramifications than for by_value above).

Одно использование указателей для реализации «эталонных» параметров без использования специального эталонного понятия, которое некоторые языки, такие как C, не имеют. (Конечно, вы также можете обращаться с указателями как с самими ценностями.)

8 голосов
/ 05 февраля 2010

Основное различие заключается в том, копируется ли переданный объект. Если это параметр значения, компилятор должен сгенерировать такой код, чтобы изменение параметра функции внутри функции не влияло на пройденный исходный объект, поэтому он обычно будет копировать объект. В случае ссылочных параметров компилятор должен сгенерировать такой код, чтобы все операции выполнялись с исходным передаваемым объектом.

2 голосов
/ 29 августа 2017

Разница довольно проста: прямые параметры передаются по значению, а получатель получает копию того, что было передано; Это означает, что если параметр был изменен получателем, эти изменения не будут отражены обратно вызывающей стороне. (Это часто вызывается, соответственно, передачей по значению или копией.

2 голосов
/ 29 января 2012

Я думаю, что эта ссылка может вам помочь Звонок по стоимости и Звонок по ссылке . Этот парень дал подробное объяснение, как это работает. Надеюсь, что это прояснит.

2 голосов
/ 05 февраля 2010

Указатель - это низкоуровневый способ представления ссылки, поэтому передача указателя (по значению) - это то, как языки, подобные C, обычно достигают передачи по семантике ссылки.

1 голос
/ 05 февраля 2010

Существует три основных параметра; указатель, ссылка и прямой.

Разница довольно проста: прямые параметры передаются по значению, а получатель получает копию того, что было передано; Это означает, что если параметр был изменен получателем, эти изменения не будут отражены обратно вызывающей стороне. (Это часто называется, достаточно соответственно, передачей по значению, или 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;
}
0 голосов
/ 05 февраля 2010

псевдокод:
Передать по значению:

void setTo4(value) { // value is passed by value
    value = 4;
}

int x = 1;
setTo4(x);
// x is still 1

Передать по ссылке:

void setTo4(value) { // value is passed by reference
    value = 4;
}

int x = 1;
setTo4(x);
// x is 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...