Достаточно в списке формальных параметров перед идентификатором поставить ключевое слово var, как мы получаем эту переменную в полное своё распоряжение и можем изменять её значение точно так же, как если бы она была глобальной.
Procedure two(a,b,c: integer; var n: integer);
Begin
n:= a * b * c;
End;
Слово varдействует только в пределах одной группы переменных, то есть до ближайшей точки с запятой.
В заголовке процедуры формальному параметру nпредшествует слово var, значит это параметр-переменная. Такой способ передачи параметров называется передачей по ссылке. Для параметров-переменных локальные переменные не создаются, а вместо значения фактического параметра передаётся адрес переменной, по которому она хранится в памяти. В этом случае в процедуре мы имеем дело именно с той переменной, которая используется при вызове процедуры как фактический параметр, поэтому все изменения формальной переменной nотразятся и на фактическом параметре.
Например, после вызова процедуры
Var res: integer; two(WIDTH, height, 2+3, res);
переменная n:= a * b * c; примет значение 1000. Но этот идентификатор n- всего лишь псевдоним переменной res, то есть это значение будет присвоено именно переменной res. Итак, в данном случае nи res- одна и та же переменная, хотя в процедуре она и называется иначе (но вы можете назвать их и одинаково).
Этот способ передачи параметров обычно используется для передачи в процедуру переменных большого размера - записи, классы, массивы. Такой способ гораздо быстрее и экономичнее, поскольку не нужно выделять под переменные память и копировать туда их значения. В процедуру передаются только их адреса, а это очень быстрая операция. Но, как говорится, недостатки - это продолжение наших достоинств: можно случайно изменить в процедуре значение переменной, а потом долго искать причину неверной работы программы.