Передача аргументов по ссылке и по значению

Передача значений аргументов при вызове процедуры или функции по ссылке (в списке аргументов для передаваемого таким образом аргумента используется ключевое словоByRef) означает, что вызываемой процедуре или функции передается адрес ячейки памяти, по которому хранится значение аргумента (т.е. вызываемая процедура или функция для работы с переданным по ссылке аргументом использует ту же ячейку или область памяти, что и вызывающая процедура пли функция). При этом не выделяется дополнительная память для работы с переданным аргументом в вызываемой программе. Изменение значения аргумента в вызываемой процедуре или в функции означает изменение значения и в вызывающей процедуре или в функции (используется одна и та же ячейка или область памяти).

Передача по ссылке (ее поясняет рис 13.2) определена по умолчанию.

Рис. 13.2. Пояснение связи по ссылке

 

Передача значений аргументов при вызове процедуры или функции по значению (в списке аргументов используется ключевое словоByVal) означает, что для аргумента выделяется дополнительная ячейка или область памяти, в которую записывается значение передаваемого аргумента. Изменения значения аргумента в вызываемой процедуре или в функции не ведут к изменению аргумента в вызывающей процедуре или в функции, так как вызываемая процедура или функция использует для аргумента другую ячейку или область памяти аналогично локальным данным (см. рис. 13.3). Это удобно, если модификация данных необходима только внутри вызываемой процедуры или функции и нет необходимости передавать измененные данные обратно в вызывающую процедуру или функцию.

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

Рис. 13.3. Пояснение связи по значению