Параметры-значения
Виды параметров
Список параметров, то есть величин, передаваемых в подпрограмму и обратно, содержится в ее заголовке.
Для каждого параметра обычно задается его имя, тип и способ передачи.
Либо тип, либо способ передачи могут не указываться.
Важно запомнить, что в заголовке подпрограммы нельзя вводить описание нового типа, там должны использоваться либо имена стандартных типов, либо имена типов, описанных программистом ранее в разделе type.
В Паскале четыре вида параметров:
· значения;
· переменные;
· константы;
· нетипизированные параметры.
Кроме того, по другим критериям можно выделить особые виды параметров:
· открытые массивы и строки;
· процедурные и функциональные параметры;
· объекты.
Параметр-значение описывается в заголовке подпрограммы следующим образом:
имя: тип; Например, передача в процедуру Р величины целого типа записывается так: procedure P(x: integer); Имя параметра может быть произвольным. Параметр х можно представить себе как локальную переменную, которая получает свое значение из главной программы при вызове подпрограммы. В подпрограмму передается копия значения аргумента.Механизм передачи следующий: из ячейки памяти, в которой хранится переменная, передаваемая в подпрограмму, берется ее значение и копируется в область сегмента стека, называемую областью параметров. Подпрограмма работает с этой копией, следовательно, доступа к ячейке, где хранится сама переменная, не имеет. По завершении работы подпрограммы стек освобождается. Такой способ называется передачей по значению.
|
|
При вызове подпрограммы на месте параметра, передаваемого по значению, может находиться выражение. Тип выражения должен быть совместим по присваиванию с типом параметра.
Например, если в вызывающей программе описаны переменные
var x: integer; c: byte; y: longint;то следующие вызовы подпрограммы Р, заголовок которой описан выше, будут синтаксически правильными:
P(x); P(c); P(y); P(200); P(x div 4 + 1);Недостатками передачи по значению являются затраты времени на копирование параметра, затраты памяти в стеке и опасность его переполнения, когда речь идет о параметрах, занимающих много места - например, массивах большого размера.
Поэтому более правильно использовать для передачи в подпрограмму исходных данных параметры-константы, о которых речь пойдет чуть дальше.
Признаком параметра-переменной является ключевое слово var перед описанием параметра:
var имя: тип;Например, передача в процедуру Р параметра-переменной целого типа записывается так:
procedure P(var x: integer);При вызове подпрограммы в область параметров копируется не значение переменной, а ее адрес, и подпрограмма через него имеет доступ к ячейке, в которой хранится переменная. Этот способ передачи параметров называется передачей по адресу. Подпрограмма работает непосредственно с переменной из вызывающей программы и, следовательно, может ее изменить.
|
|
При вызове подпрограммы на месте параметра-переменной может находиться только ссылка на переменную точно того же типа.