Шаг 26.
Указательные типы

    На этом шаге мы рассмотрим особенности использования указательных типов.

    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. Результат работы приложения

    На следующем шаге мы рассмотрим текстовый тип.




Предыдущий шаг Содержание Следующий шаг