Лекции по информатике - Способы передачи параметров
- по значению - при вызове подпрограммы выделяется память для формального
параметра. Вычисляется значение фактического параметра и результат записывается
в указанную память. Далее подпрограмма уже работает с этой копией (используется
для входных параметров; т.к. мы работаем с копией, то сам фактический параметр
изменить уже нельзя, что гарантирует защиту от побочного эффекта). По окончании
работы подпрограммы память освобождается.
- для результата - память для переменной выделяется, но туда ничего не
записывается, по окнончанию работы подпрограммы происходит запись из нее в фактический
параметр (используется для передачи выходных параметров, т.е. результата).
- значение-результат - используются оба механизма (может использоваться
для входных, входно-выходных и выходных параметров, но может возникнуть побочный
эффект).
- по ссылке (адресу) - память не выделяется, подпрограмма работает с
памятью выделенной фактическому параметру (может быть использовано для входных,
входно-выходных и выходных параметров)
- Текст, макроподстановка – везде, где встречается обработка формального
параметра происходит автоматическая замена формального параметра на текст фактического.
При этом в зависимости от текста фактического параметра не всегда может произойти
корректная работа компилятора. Пример: пусть xзаменяется на a+b, тогда выражение
вида x:=x+1 заменяется на выражение a+b:=a+b+1, а это ошибка, т.к. не понятно
значение какой переменной необходимо менять.
В Паскале реализованы не все из указанных выше способов передачи параметров.
В этом языке программирования способ передачи определяется по описанию заголовка
подпрограммы. Если перед именем переменной следует зарезервированное слово var,
то считается, что переменная передается по ссылке, а если этого слова нет - то
по значению.
Следует помнить, что файловые переменные можно передавать только по ссылке.
По значению передаются структуры, требующие мало памяти, все остальное лучше передавать
по ссылке.
Слава Антонов © 2002 — August 13, 2008 |
|
197-577-902 |
|