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