Прежде всего, когда вы вызываете функцию (или процедуру, как бы вы ее ни назвали), создается новый стек вызовов. В этом стеке вызовов параметры присваиваются значениям (параметры — это те, которые являются частью подписи вашей функции. Обычно мы называем их «формальными параметрами», например 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