Индексирование символьного указателя
Так как символьный массив с нулевой базой совместим с сим- вольным указателем, символьный указатель можно индексировать ана- логично символьному массиву с нулевой базой.
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));
Вложенные вызовы функций работы со строками с завершающим нулем могут оказаться очень удобными, когда вы хотите указать оп- ределенную взаимосвязь между последовательными операциями со строками.