Список параметров, передаваемый в процедуры и функции, состоит из имен параметров и указаний на их тип. Например, в объявлении
procedure Pr(X1, X2: real; A: integer);
указано три параметра X1, Х2, А и определены их типы. Вызов такой процедуры может иметь вид:
Pr(Y, X2, 5);
Это только один из способов передачи параметров в процедуру, называемый передачей по значению. Работает он так. В момент вызова функции в памяти создаются временные переменные с именами X1, Х2, А и в них копируются значения аргументов Y, Х2 и константы 5. На этом связь между аргументами и переменными X1, Х2, А разрывается. Вы можете изменять внутри процедуры значения X1, Х2 и А, но это никак не отразится на значениях аргументов. Аргументы при этом надежно защищены от непреднамеренного изменения своих значений вызванной процедурой или функцией.
К недостаткам такой передачи параметров по значению относятся затраты времени на копирование значений и затраты памяти для хранения копии.
Еще одним недостатком передачи параметров по значению является невозможность из функций и процедур изменять значения некоторых аргументов, что во многих случаях очень желательно.
Возможны и другие способы передачи параметров: как переменных (иногда это называется передачей по ссылке), как констант и как выходных величин. Эти способы осуществляются указанием перед именем соответствующего параметра спецификатора var, const или out.
При передаче параметра по ссылке перед его именем в заголовке процедуры должно быть указано ключевое слово var. Например:
procedure Pr ( var X1: real; X2: real; A: integer);
В этом случае не происходит копирования значения аргумента в локальную, временную переменную в процедуре. Процедура реально работает не с параметром, а со ссылкой – указателем на место хранения аргумента в памяти. Соответственно, в приведенном примере любые изменения параметра X1, произведенные в процедуре, в действительности относятся не к этому параметру, а к тому аргументу Y, который передан при вызове процедуры. Таким образом, ключевое слово var позволяет возвращать информацию из процедуры в вызвавшую его внешнюю процедуру.
Передача параметра как константы осуществляется заданием перед его именем ключевого слова const. Например:
Такая передача параметра почти идентична по своим последствиям обычной передаче по значению. Как и в том случае, значение аргумента невозможно изменить, изменяя параметр процедуры. Но есть одно существенное отличие: если при передаче параметра по значению вы можете в тексте процедуры изменять значение соответствующей ему локальной переменной, то при передаче параметра как константы это невозможно. При попытке в теле процедуры изменить значение параметра, переданного как константа, компилятор выдаст сообщение об ошибке.
Передача параметра как константы позволяет сделать код более эффективным, так как при этом компилятору заведомо известно, что никакие изменения параметра невозможны.
Передача параметра как выходного осуществляется заданием перед его именем спецификатора out. Например:
procedure Prc ( out X1: real; X2: real; A: integer);
Передача параметра как выходного очень похожа на передачу по ссылке. Отличие в том, что при этом не гарантируется передача в процедуру начального значения этого параметра. Часто такая передача применяется для аргументов, являющихся структурами. При этом память, занимаемая аргументом, в момент обращения к процедуре очищается. Таким образом параметр, переданный как выходной, указывает на некоторое место в памяти, являющееся просто контейнером, куда процедура должна занести соответствующее выходное значение.
Параметры обеспечивают механизм замены, который позволяет выполнять процедуру с различными начальными данными. Между фактическими параметрами в операторе вызова процедуры и формальными параметрами в заголовке описания процедуры устанавливается взаимнооднозначное соответствие в результате их перебора слева направо. Количество и тип формальных параметров равно количеству и типу фактических параметров.