На этом шаге мы рассмотрим особенности использования указательных типов.
Object Pascal поддерживает два стандартных указательных типа Pointer и PChar. Значениями переменных и констант указательных типов являются адреса оперативной памяти, состоящие из адреса сегмента (1 слово = 2 байта) и смещения (1 слово = 2 байта). Адрес сегмента хранится в старшем слове, а смещение - в младшем слове полного адреса.
Переменные типа Pointer, в отличие от определяемых пользователем указательных типов, могут содержать адрес переменной любого типа и являются бестиповыми указателями. Поэтому, применение операции разыменования (^) к переменным типа Pointer приводит к ошибке.
Тип PChar поддерживает формат представления строк, признаком конца которых служит символ с кодом 0 (нуль) и которые называют строками с завершающим нулем.
Необходимо отметить, что хотя тип PChar введен для поддержки строковых структур данных, фактически он является указательным типом с описанием
type PChar = ^Char;
Переменные же этого типа (при установленной директиве компилятора {$Х+}) обрабатываются как массив типа
array [0..K] of Char;
При таком способе реализации строк текущая длина строки фиксируется специальным символом-признаком, который ставится после последнего смыслового символа строки. В Object Pascal, в качестве такого признака используется символ с нулевым кодом, который называется "нуль-символ" и обозначается или NULL, или \0. Этот способ указания текущей длины практически не ограничивает максимально допустимую длину. В IBM-совместимых компьютерах ограничение все же имеется и установлено размером в один сегмент памяти (65535 байт).
Строки с завершающим нулем хранятся в виде символьных массивов с нулевой базой (то есть нижняя граница которых равна нулю).
Рис.1. Хранение строки с завершающим нулем
Приведем примеры описания массивов с нулевой базой.
const Len = 511; type TStr9 = array[0..9] of Char; TStr80 = array[0..80] of Char; TStrLen = array[0..Len] of Char;
При установленной директиве расширенного синтаксиса {$Х+} (она принимается по умолчанию) символьный массив с нулевой базой совместим с типом PChar. Кроме того, строковые константы также совместимы по присваиванию с типом PChar.
Например:
procedure TForm1.FormCreate(Sender: TObject); const Str80 : array[0..80] of Char = 'Строка типа PChar'; var P : PChar; begin P := 'Строка типа PChar'; Edit1.Text:=P; P := Str80; Edit2.Text:=P; end;
Текст этого примера можно взять здесь.
Результат работы приложения изображен на рисунке 2:
Рис.2. Результат работы приложения
Допускается также передача строковых констант в качестве фактических параметров, если соответствующие формальные параметры имеют тип PChar:
const Name : PChar = 'Object Pascal'; procedure Test (Str : PChar); begin . . . . end; . . . . Test (Name); . . . . end.
Заметим, что хотя типизированные константы типа PChar допускаются, однако их длина ограничена так же, как и типизированных констант типа String, 255-ю символами.
Переменные типа PChar допускается индексировать аналогично символьному массиву с нулевой базой.
procedure TForml .FormCreate (Sender: TObject); const Str80 : array[0..80] of Char = 'Object Pascal'; var P: PChar; begin P :=Str80; Edit1.Text:= 'Str80[5]=' + Str80[5]; // Эти два оператора печатают Edit2.Text:= 'P[5] = ' + P[5]; // один и тот же символ 't'. end;
Текст этого примера можно взять здесь.
Результат работы приложения изображен на рисунке 3:
Рис.3. Результат работы приложения
На следующем шаге мы рассмотрим текстовый тип.