Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BorlandPascal.doc
Скачиваний:
54
Добавлен:
17.03.2015
Размер:
2.83 Mб
Скачать

Символьные указатели и символьные массивы

Если вы с помощью директивы $X разрешаете расширенный син-

таксис, то символьный массив с нулевой базой совместим с типом

PChar. Это означает, что там, где предполагается использование

типа PChar, может использоваться символьный массив с нулевой ба-

зой. Когда символьный массив используется вместо значения PChar,

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

значение которой соответствует адресу первого элемента массива.

Например:

var

A: array[0..63] of Char;

P: PChar;

.

.

.

begin

P := A;

PrintStr(A);

PrintStr(P);

end;

Благодаря оператору присваивания P теперь указывает на пер-

вый элемент массива A, поэтому PrintStr вызывается дважды с одним

и тем же значением.

Вы можете инициализировать типизованную константу, имеющую

тип символьного массива с нулевой базой, с помощью строкового ли-

терала, имеющего меньшую длину, чем размер массива. Оставшиеся

символы устанавливаются в значение NULL (#0), и массив будет со-

держать строку с завершающим нулем.

type

TFileName = array[0..79] of Char;

const

FileNameBuf: TfileName = 'TEST.PAS';

FileNamePtr: PCahr = FileNameBuf;

Индексирование символьного указателя

Так как символьный массив с нулевой базой совместим с сим-

вольным указателем, символьный указатель можно индексировать ана-

логично символьному массиву с нулевой базой.

var

A: array[0..63] of Char;

P: PChar;

Ch: Char;

.

.

.

begin

P := A;

Ch := A[5];

Ch := P[5];

end;

Оба последних присваивания присваивают Ch значение, содержа-

щееся в шестом символе-элементе A.

При индексировании символьного указателя индекс задает безз-

наковое смещение, которое добавляется к указателю перед его разы-

менованием. Таким образом, P[0] эквивалентно P^ и задает символ,

на который указывает P. P[1] задает символ справа от того, на ко-

торый указывает P, P[2] задает следующий символ и т.д. Для целей

индексирования PChar ведет себя таким образом, как если бы он

описывался:

type

TCharArray = array[0..65535] of Char;

Pchar = ^TCharArray;

Компилятор при индексировании символьного указателя не вы-

полняет проверку диапазона, так как у него нет информации о типе,

по которой можно определить максимальную длину строки с завершаю-

щим нулем, на которую указывает символьный указатель.

Показанная ниже функция StrUpper иллюстрирует использование

символьного указателя для преобразования строки с завершающим ну-

лем в верхний регистр.

function StrUpper(Srt: Pchar): Pchar;

var

I: Word;

begin

I := 0;

while Str[I] <> #0 do

begin

Str[I] := UpCase(Str[I]);

Inc(I);

end;

StrUpper := Str;

end;

Обратите внимание, что StrUppper - это функция, а не проце-

дура, и что она всегда возвращает значение, которое передавалось

ей в качестве параметра. Так как расширенный синтаксис допускает

игнорирование результата функции, StrUpper может интерпретиро-

ваться, как процедура:

StrUpper(A);

PrintStr(A);

Однако, StrUpper всегда возвращает передаваемое ей значение,

приведенные выше операторы можно скомбинировать в один:

PrintStr(StrUpper(A));

Вложенные вызовы функций работы со строками с завершающим

нулем могут оказаться очень удобными, когда вы хотите указать оп-

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

строками.

Соседние файлы в предмете Программирование на Pascal