Параметры процедур и функций

Глобальные переменные (описанные в главной программе) доступны из любого места программы или подпрограммы, кроме тех случаев, когда в подпрограмме используются локальные переменные с такими же именами. Значит, такие переменные можно использовать для обмена данными между основной программой и подпрограммой. Однако такой способ создает неудобства при отладке и сужает возможность использования процедур и функций в других программах.

Оптимальным способом обмена данными между вызывающей и вызываемой подпрограммой в подавляющем большинстве случаев является использование механизма параметров.

В подпрограммах на языке Паскаль существуют два основных типа параметров:

  • параметр, перед которым отсутствует ключевое слово var или const называется параметром-значением, например:

    function AddSquare(a, b: integer): integer;

  • параметр, перед которыми стоит ключевое слово var или const называется параметром-переменной, например:

    procedure Mult2(var a: integer);

Формальный параметр-значение при вызове подпрограммы получает, специально созданную в области памяти, копию значения соответственного фактического параметра. В подпрограмме выполняются операции с копией без доступа к переменной вызывающей программы. После окончания работы подпрограммы выделенная под параметр-значение память освобождается. Этот способ называется передачей по значению.

Формальный параметр-переменная при вызове подпрограммы получает адрес области памяти, в которой хранится соответствующий фактический параметр. Поэтому любое изменение формального параметра-переменной в подпрограмме приводит к изменению переменной в вызывающей программе. Такой способ называется передачей по ссылке (или по адресу).

Пример. В программе используется процедура «Удвоитель».

  • procedure Mult2(a: integer; var b: integer);
  • begin
  • a *= 2;
  • b *= 2;
  • end;
  • begin
  • var num1: integer := 10;
  • var num2: integer := 10;
  • Mult2(num1, num2);
  • writeln(num1); {вывод 10}
  • writeln(num2); {вывод 20}
  • end;

Переменная num1 передается по значению, поэтому ее значение не меняется.

Значение переменной num2 изменяется, т. к. переменная передается по ссылке (о чем свидетельствует наличие ключевого слова var перед соответственным формальным параметром b).