Так как символьный массив с нулевой базой совместим с сим-
вольным указателем, символьный указатель можно индексировать ана-
логично символьному массиву с нулевой базой.
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);
B.Pascal 7 & Objects/LR - 304 -
end;
StrUpper := Str;
end;
Обратите внимание, что StrUppper - это функция, а не проце-
дура, и что она всегда возвращает значение, которое передавалось
ей в качестве параметра. Так как расширенный синтаксис допускает
игнорирование результата функции, StrUpper может интерпретиро-
ваться, как процедура:
StrUpper(A);
PrintStr(A);
Однако, StrUpper всегда возвращает передаваемое ей значение,
приведенные выше операторы можно скомбинировать в один:
PrintStr(StrUpper(A));
Вложенные вызовы функций работы со строками с завершающим
нулем могут оказаться очень удобными, когда вы хотите указать оп-
ределенную взаимосвязь между последовательными операциями со
строками.