Если перед именем формального параметра стоит ключевое слово VAR, то такой параметр есть параметр-переменная. Примерами таких параметров служат X1 и Х2 в заголовке
Фактический параметр, соответствующий параметру-переменной, может быть только переменной (не константой и не выражением).
При вызове процедур (функций) параметры-переменные обрабатываются так: для формального параметра используется именно та ячейка, которая содержит соответствующий фактический параметр.
Пример. При вызове процедуры SQ оператором SQ(P,Q, R,Y,Z) для переменных X1 и Х2 используются непосредственно те ячейки, которые отведены для Y и Z. Поэтому оператор присваивания Х1: = (-B+SQRT(D))/(2*A) засылает полученное значение в ячейку Y.
Под формальные и фактические параметры-значения транслятор отводит разные области памяти. Поэтому результат выполнения процедуры может быть передан только через параметр-переменную.
Пример.
Результаты, выдаваемые процедурой Н:1 и 1; программа печатает 0 и 1.
Разберем этот пример: фактический параметр А соответствует формальному параметру-значению X, а фактический параметр В -' формальному параметру-переменной Y. Под параметры А и X отведены две разные ячейки памяти, а под В и Y - однаи та же ячейка.
При обращении к Н(А,В) из ячейки А пересылается значение О в ячейку X, а в ячейку Y засылается адрес ячейки В, содержащей О, так как в процедуре Н параметр X - это параметр-значение, a Y - параметр-переменная.
При выполнении оператора Х: = Х+1 в ячейку X прибавляется 1 и в ячейке X окажется 1, а в ячейке А по-прежнему - 0.
Выполнение оператора Y: = Y + 1 имеет следующий смысл: "взять число из ячейки, адрес которой находится в Y (т. е. из ячейки В), прибавить 1 и заслать в ту же ячейку (т. е. в В)."
Поэтому в результате выполнения оператора Y: = Y + 1 значение ячейки В станет 1. Оператор печати из процедуры WRITELN (X, Y) выдаст содержимое ячейки X и ячейки Y, т. е. 1 и 1. Оператор печати WRITELN (А, В) в программе напечатает содержимое А, которое осталось равным 0, и содержимое ячейки В, которое равно 1.
Процедуры в паскале допускают рекурсию, т. е. процедур может вызвать сама себя.
Если в процедуре Р есть обращение к процедуре Q, описанной ниже, то перед описанием Р процедура Q декларируется как FORWARD: после заголовка процедуры Q ставится двоеточие, а за чем ключевое слово FORWARD*.
Пример.
* (Обращаем внимание, что в этом случае параметры процедуры описываются только в операторе с FORWARD. В заголовке самой процедуры параметры опускаются. Подробнее о рекурсии сказано в п. 14.3.)