ВУЗ:
Составители:
Рубрика:
9
function f: real;
begin
...
end;
begin
a:=@p;
b:=f; // равноценно b:=@f
a(5); // вызов процедуры через процедурную перемен-
ную a
writeln(b); // вызов функции через процедурную пе-
ременную b
end.
1.3 Указатели pointer
Бестиповые указатели pointer хранят адрес памяти, не связанный с объек-
том определенного типа, и не могут быть разыменованы. Чтобы воспользоваться
данными по этому адресу, бестиповой указатель следует преобразовать к указате-
лю на конкретный тип. Например:
type pinteger = ^integer;
preal =^real;
var i: integer;
r: real;
p: pointer;
begin
p:=@i;
pinteger(p)^:=5;
writeln(pinteger(p)^);
p:=@r;
preal(p)^:=3.14;
writeln(preal(p)^);
end.
Рассмотрим запись pinteger(p)^ подробнее. Здесь перед доступом к
данным
по указателю p мы вначале преобразуем его к указателю на integer, а потом ра-
зыменовываем. Поскольку перед обращением к pinteger(p)^ было выполнено
присваивание p:=@i, то выражение pinteger(p)^ становится синонимом
имени i и может быть использовано как в левой, так и в правой части оператора
присваивания.
Гибкость указателей pointer имеет
обратную сторону: их применение по-
тенциально опасно и может приводить к ошибкам, причину которых сложно ус-
тановить. Например, в результате выполнения кода
Страницы
- « первая
- ‹ предыдущая
- …
- 5
- 6
- 7
- 8
- 9
- …
- следующая ›
- последняя »