разница между передачей по значению, передачей по ссылке и передачей по

У меня есть этот вопрос о методах передачи, и я хочу убедиться, что правильно его понимаю.

Каково значение i и массива a, если аргументы передаются значением b ссылкой c значением/результатом, предположим, что у нас есть следующий псевдокод

введите здесь описание изображения

это мой ответ

 By value 
 i = 1
 a[1]=10
 a[2]=11

  by reference
 i = 3
 a[1] = 2
 a[2] = 11

 by value result
i = 2
a[1] = 10
a[2] = 1

это правильно ? Благодарность


person Muhannad    schedule 10.05.2016    source источник
comment
так что [2] здесь никогда не изменится? всегда будет a[2] = 11 ?   -  person Muhannad    schedule 10.05.2016


Ответы (1)


Прежде всего, когда вы вызываете функцию (или процедуру, как бы вы ее ни назвали), создается новый стек вызовов. В этом стеке вызовов параметры присваиваются значениям (параметры — это те, которые являются частью подписи вашей функции. Обычно мы называем их «формальными параметрами», например x y z в приведенной выше процедуре f). То, чему они назначаются, соответствует фактическим аргументам, с помощью которых вызывается функция.

Если они передаются значениями, формальные параметры присваиваются значениям аргументов. Это означает, что значения фактических аргументов копируются в формальные параметры. Любые дальнейшие операции над формальными параметрами никак не влияют на аргумент. В вашем примере y присваивается значению a[1], которое равно 10. В теле функции переназначается y, но с a[1] больше ничего не происходит.

С другой стороны, если они передаются по ссылке, формальные параметры присваиваются адресу памяти фактических аргументов, а в теле функции формальные параметры неявно разыменовываются в значения этого адреса памяти. В вашем примере x также будет содержать адрес памяти i, y для a[1] и z для i. Операция над x y z на самом деле является операцией над i и a[1].

Я не знаю, что вы подразумеваете под «переданным по значению результатом». Таких терминов я больше нигде не встречал.

Еще одна вещь, которую я хочу упомянуть, это то, что в мире программирования есть два разных значения слова «ссылка». У меня не будет времени для длинных объяснений. Вы можете искать «ссылочный тип в Java» и «ссылочные переменные в C++», чтобы увидеть разницу.

person Xiaojun Chen    schedule 01.07.2016