Указательные типы

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

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий