Задача: составить процедуру, которая меняет местами значения двух переменных.
Особенности данной задачи заключаются в том, что нам надо, чтобы изменения, сделанные в процедуре, стали известны вызывающей программе.
Попробуем написать процедуру таким образом:
var x, y: integer;
procedure Swap (a, b: integer); // при таком описании параметров процедуры,
var c: integer;
begin // будет происходить копирование значений аргументов (x и y)
// переменные a и b - самостоятельные переменные, не связанные с x и y
c := a;
a := b;
b := c;
end;
begin
x := 1;
y := 2;
Swap (x, y); //значения переменных x и y (аргументы) копируются в параметры a и b
writeln('x = ', x, ', y = ', y); // x = 1, y = 2
end.
Если запустить данную программу, то можно увидеть, что значения переменных
x и
y не изменилось. Для того чтобы параметры изменяли значения аргументов необходимо использовать
передачу данных по ссылке. Для этого после названия типа данных в заголовке подпрограммы необходимо поставить слово
var
procedure Swap (var a, b: integer); // теперь переменные a и b получают адреса переменных x и y в памяти
var c: integer;
begin
c := a;
a := b;
b := c;
end;
Применение: Если вы передаете аргумент по ссылке, то при вызове процедуры на этом месте может стоять только имя переменной (
НЕ число и НЕ арифметическое выражение)!
НЕЛЬЗЯ вызвать процедуру таким образом:
Swap (x, 4);
Swap(5+x, y);