ВУЗ:
Составители:
Рубрика:
8
1.2  Неявные указатели 
Указатели неявно встречаются во многих конструкциях языка программиро-
вания.  Например,  при  передаче  параметра  по  ссылке  в  подпрограмму  на  самом 
деле передается указатель. Сравним две реализации одной процедуры: 
procedure Mult2(var i: integer); 
begin 
  i:=i*2; 
end; 
procedure Mult2P(pi: pinteger); 
begin 
  pi^:=pi^*2; 
end; 
var a: integer; 
begin 
  a:=3; 
  Mult2(a); 
  Mult2P(@a); 
  ... 
Код, генерируемый для таких процедур, практически идентичен: в обоих случаях 
в  процедуру 
передается  адрес  переменной,  которую  следует  удвоить.  Однако 
пользоваться первой версией процедуры с параметром, передаваемым по ссылке, 
гораздо удобнее: в теле процедуры не надо разыменовывать указатель и при вы-
зове  процедуры  в  качестве  параметра  надо  указывать  саму  переменную,  а  не  ее 
адрес. Из данного примера видно, что параметр, передаваемый по ссылке, можно
трактовать как указатель, который при использовании неявно разыменовывается.  
Другой  пример  неявных  указателей – процедурные  переменные.  Процедур-
ная переменная хранит адрес процедуры или функции с соответствующей сигна-
турой, либо же значение nil (напомним, что сигнатура подпрограммы определя-
ется ее заголовком и включает количество и типы ее параметров, а для функций 
также  и 
тип  возвращаемого  значения).  Для  присваивания  процедурной  перемен-
ной  a  адреса  подпрограммы  p  с  соответствующей  сигнатурой  знак  операции  @ 
использовать необязательно: записи a:=@p и a:=p равнозначны. Например:  
type proc = procedure (i: integer); 
     func = function: real; 
var a: proc;  
    b: func; 
procedure p(i: integer);  
begin 
  ...  
end; 
Страницы
- « первая
 - ‹ предыдущая
 - …
 - 4
 - 5
 - 6
 - 7
 - 8
 - …
 - следующая ›
 - последняя »
 
