Различие между параметром, передаваемым по значению и параметром ссылки?

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

Спасибо

5
задан Naveed 5 February 2010 в 12:38
поделиться

5 ответов

Изменения параметра значения не видны вызывающему абоненту (также называется "pass by value").

Изменения параметра привязки видны вызывающему абоненту ("передача по ссылке"). Пример

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. (Конечно, указатели можно также рассматривать как сами значения)

.
14
ответ дан 18 December 2019 в 06:02
поделиться

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

2
ответ дан 18 December 2019 в 06:02
поделиться

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

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
0
ответ дан 18 December 2019 в 06:02
поделиться

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

8
ответ дан 18 December 2019 в 06:02
поделиться

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

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

Указатели также передаются по значению, но вместо того, чтобы отправлять фактическое значение, вызывающий отправляет адрес значения. Это означает, что, следуя этому указателю, получатель может изменить аргумент. Обратите внимание, что изменения, внесенные в фактический указатель, по-прежнему не отражаются обратно для вызывающего.

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

Стоит отметить, что в основе всего этого лежат параметры всегда передается по значению, но разные языки имеют разные способы реализации эталонной семантики (см. ответ Килотанов).

// 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;
}
1
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: