Основы алгоритмизации и программирования. Часть третья. Структурированные типы данных. Асламова В.С - 5 стр.

UptoLike

9
всегда должен стоять на том же месте, что и соответствующий ему
формальный параметр.
Важно различать передачу параметров по значению и передачу
параметров по ссылке.
1) Передача параметров по значению (call by value).
Формальные параметры, вызов которых должен обеспечить передачу
значения, присутствуют в списке параметров только в виде имен, за
которыми следует тип параметра. В качестве фактических параметров при
вызове можно использовать выражение, константу или переменную того же
типа, значения которого передаётся в начале процедуры формальному
параметру.
Для параметровзначений компьютер при вызове процедур
выполняет следующие действия: выделяет место в памяти для каждого
формального параметра, вычисляет значение фактического параметра и
засылает его в ячейку, соответствующую формальному параметру.
Если фактический параметр есть имя переменной, то значение этой
переменной пересылается в
соответствующий формальный параметр. На
этом всякая связь между ними обрывается.
Если же фактический и формальный параметры одинаково
обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это
полезно знать, чтобы не допустить распространённой среди начинающих
программистов ошибкипытаться передать информацию из процедуры в
вызывающую программу через параметр-значение.
В примере, рассмотренном
ниже, передача параметра по значению
применяется для формального параметра x и фактического параметра i.
2) Передача параметров по ссылке (call by reference).
Формальным параметрам, вызов которых должен обеспечить передачу
параметров по ссылке, в списке параметров предшествует var.
В качестве
фактических параметров они должны заменяться только именем переменной
того же типа (не константой и не выражением).
При вызове процедур (функций) параметрыпеременные
обрабатываются так: формальному параметру передаётся адрес ячейки,
соответствующего фактического параметра.
Если var - параметр изменяется в процессе выполнения процедуры, то
будет изменён идентично и соответствующий ему фактический параметр.
10
Поэтому результат выполнения процедуры может быть передан только через
var- параметр.
В примере, рассмотренном ниже, передача параметра по ссылке
используется для формального параметра y, которому передается адрес
фактического параметра k.
Пример:
Следующий пример демонстрирует принципиальную разницу между
передачей параметров по значению и по ссылке.
var i,k:integer;
procedure c(x:integer, var y:integer);
begin
writeln (в процедуре);
x:=x+1; y:=y+1;
writeln(передача параметра по значению,x:4);
writeln (передача параметра по ссылке,y:4);
end;
begin
{исполняемая часть программы}
i:=5; k:=5;
writeln (i= ,i:4,k= ,k:4);
{вызов процедуры}
c(i,k);
writeln(значения после выполнения процедуры);
writeln(передача параметра
по значению i= ,i:4);
writeln(передача параметра по ссылке k= ,k:4);
end.
Можно представить результат вызова процедуры следующим образом:
вызов с(i,k); соответствует блоку:
begin
x:=i;
begin
x:=x+1;
k:=k+1;
end;
end.
То есть фактический параметр i передаёт своё значение формальному
параметру у. Процедура увеличивает значение копии i и значение оригинала
всегда должен стоять на том же месте, что и соответствующий ему            Поэтому результат выполнения процедуры может быть передан только через
формальный параметр.                                                       var- параметр.
       Важно различать передачу параметров по значению и передачу                  В примере, рассмотренном ниже, передача параметра по ссылке
 параметров по ссылке.                                                     используется для формального параметра y, которому передается адрес
         1)    Передача параметров по значению (call by value).            фактического параметра k.
      Формальные параметры, вызов которых должен обеспечить передачу             Пример:
значения, присутствуют в списке параметров только в виде имен, за                Следующий пример демонстрирует принципиальную разницу между
которыми следует тип параметра. В качестве фактических параметров при      передачей параметров по значению и по ссылке.
вызове можно использовать выражение, константу или переменную того же
типа, значения которого передаётся в начале процедуры формальному                 var i,k:integer;
параметру.                                                                        procedure c(x:integer, var y:integer);
                                                                                  begin
      Для параметров – значений компьютер при вызове процедур
                                                                                        writeln (′в процедуре′);
выполняет следующие действия: выделяет место в памяти для каждого                       x:=x+1; y:=y+1;
формального параметра, вычисляет значение фактического параметра и                      writeln(′передача параметра по значению′,x:4);
засылает его в ячейку, соответствующую формальному параметру.                           writeln (′передача параметра по ссылке′,y:4);
      Если фактический параметр есть имя переменной, то значение этой             end;
переменной пересылается в соответствующий формальный параметр. На                 begin
                                                                                                                        {исполняемая часть программы}
этом всякая связь между ними обрывается.
                                                                                        i:=5; k:=5;
      Если же фактический и формальный параметры одинаково                              writeln (′i= ′,i:4,′k= ′,k:4);
обозначены, в памяти ЭВМ эти параметры занимают разные ячейки. Это                                                       {вызов процедуры}
полезно знать, чтобы не допустить распространённой среди начинающих                     c(i,k);
программистов ошибки – пытаться передать информацию из процедуры в                      writeln(′значения после выполнения процедуры′);
вызывающую программу через параметр-значение.                                           writeln(′передача параметра по значению i= ′,i:4);
                                                                                        writeln(′передача параметра по ссылке k= ′,k:4);
      В примере, рассмотренном ниже, передача параметра по значению
                                                                                  end.
применяется для формального параметра x и фактического параметра i.
                                                                                 Можно представить результат вызова процедуры следующим образом:
        2)     Передача параметров по ссылке (call by reference).
                                                                           вызов с(i,k); соответствует блоку:
      Формальным параметрам, вызов которых должен обеспечить передачу
параметров по ссылке, в списке параметров предшествует var. В качестве            begin
фактических параметров они должны заменяться только именем переменной                     x:=i;
того же типа (не константой и не выражением).                                                     begin
                                                                                                       x:=x+1;
      При     вызове    процедур     (функций)    параметры – переменные
                                                                                                       k:=k+1;
обрабатываются так: формальному параметру передаётся адрес ячейки,                                end;
соответствующего фактического параметра.
                                                                                  end.
      Если var - параметр изменяется в процессе выполнения процедуры, то
будет изменён идентично и соответствующий ему фактический параметр.              То есть фактический параметр i передаёт своё значение формальному
                                                                           параметру у. Процедура увеличивает значение копии i и значение оригинала
                                   9                                                                             10