Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
67
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Указатели

Указатель хранит адрес памяти. В Pascal ABC имеются типизированные указатели (содержат адрес ячейки памяти данного типа) и бестиповые указатели (содержат адрес оперативной памяти, не связанный с данными какого-либо определенного типа).

Тип указателя на тип T имеет форму ^T, например:

type pinteger=^integer; var p: ^record r,i: real end;

Бестиповой указатель описывается с помощью слова pointer.

Для доступа к ячейке памяти, адрес которой хранит типизированный указатель, используется операция разыменования ^:

var   i: integer;   pi: ^integer; ... pi:=@i; // указателю присвоили адрес переменной i pi^:=5; // переменной i присвоили 5

Операция разыменования не может быть применена к бестиповому указателю.

Типизированный указатель может быть неявно преобразован к бестиповому:

type preal=^real; var   p: pointer;   pr: ^real; ... p:=pr;

Обратное преобразование может быть выполнено только явно:

pr:=preal(p); pr^:=3.14;

Указатели можно сравнивать на равенство (=) и неравенство (<>). В дополнение к этому типизированные указатели можно сравнивать, используя операции <, >, <=, >=.

Для типизированных указателей доступны также операции p+i, p-i и p2-p1, где i - целое (см.п.Выражения и операции).

Для того чтобы отметить тот факт, что указатель никуда не указывает, используется стандартная константа nil (нулевой указатель) : p:=nil.

Файлы

Файл в Pascal ABC представляет собой последовательность элементов одного типа, хранящихся на диске. В Pascal ABC имеется два типа файлов - типизированные и текстовые. Текстовые файлы хранят символы, разделенные на строки символами #13#10.

Для описания текстового файла используется стандартное имя типа text, а для описания типизированного файла - конструкция file of тип элементов:

var   f1: file of real;   f2: text;

Процедурный тип

Переменные, предназначенные для хранения процедур и функций, называются процедурными. Тип процедурной переменной имеет вид:

procedure (список параметров)

или

function (список параметров): тип возвращаемого значения

При этом список параметров вместе с круглыми скобками могут отсутствовать. Например:

type proc=procedure(i: integer); var   p1: proc;   p2: procedure;   f1: function: integer;

Процедурной переменной можно присвоить процедуру или функцию с совместимым типом:

procedure my(i: integer); begin   ... end; function f: integer; begin end; ... p1:=my; f1:=f;

После этого можно вызвать процедуру или функцию через эту процедурную переменную, пользуясь обычным синтаксисом вызова:

p1(5); write(f1);

Обычно процедурные переменные передаются как параметры для реализации обратного вызова:

procedure foreach(var a: array [1..100] of real; n: integer; p: procedure(var r: real)); var i: integer; begin   for i:=1 to n do     p(a[i]); end;

procedure mult2(var r: real); begin   r:=2*r end;

procedure print(var r: real); begin   write(r,' '); end; ... foreach(a,10,mult2); // умножение элементов массива на 2 foreach(a,10,print); // вывод элементов массива

 

Эквивалентность типов

В Pascal ABC два типа считаются эквивалентными (равными), если совпадают их описания. Например, после описаний

type Arr=array [1..100] of integer; var   a: Arr;   b: array [1..100] of integer;

можно присваивать массивы друг другу:

a:=b;

В типах записей, помимо типов полей, должны совпадать имена:

type   rec1 = record i,j: integer end;   rec2 = record x,y: integer end; ... var r1: rec1; r2: rec2; ... r1:=r2; // ошибка!

В типах формальных параметров процедур и функций имена могут не совпадать:

type   proc1 = procedure (i: integer);    proc2 = procedure (x: integer); ... var p1: proc1; p2: proc2; ... p1:=p2; // все в порядке

Подобная расширенная трактовка эквивалентности (по сравнению с Borland Pascal и Borland Delphi) позволяет передавать параметры составного типа (массивы, записи, процедурный и указательный) в процедуры и функции, не определяя для этих параметров новый тип:

procedure foreach(var a: array [1..100] of real; n: integer; f: function(r: real): real); var i: integer; begin   for i:=1 to n do     a[i]:=f(a[i]); end;