Использование указателей для работы со строками...120
Строку с завершающим нулевым символом можно рассматривать как массив символов, в котором последний символ равен нулю ( язык С++ использует нуль как символ конца строки ). Такие нуль-завершённые массивы можно рассматривать как отдельный тип ( точнее, квази-тип ), о котором шла речь в главе 7, "Хранение последовательностей в массивах". В С++ для работы со строками часто используются указатели. В приведённых ниже примерах показано, каковы отличия в работе со строками в случае применения массивов и указателей.
С помощью указателей можно работать с символьными массивами так же, как и с массивами любого другого типа. То, что в конце любой строки находится символ конца строки, делает их особенно удобными для работы с помощью указателей, что видно на примере следующей программы.
/* DisplayString — вывод символьного массива с использованием указателей и индексов массива */
#include
#include
#include
using namespace std ;
int main( int nNumberofArgs , char* pszArgs[ ] )
{
setlocale ( LC_ALL , ".1251" ) ; /* печать русских текстов */
/* Объявляем строку */
char* szString = "Randy" ;
_________________
120 стр. Часть 2. Становимся функциональными программистами
cout << "Массив ' " << szString << " ' " << endl ;
/* Выводим szString как массив */
cout << "Выводим строку как массив: " ;
for ( int i = 0 ; i < 5 ; i++ )
{
cout << szString[ i ] ;
}
cout << endl ;
/* Воспользуемся арифметикой указателей */
cout << "Выводим строку с помощью указателя: " ;
char* pszString = szString ;
while ( *pszString )
{
cout << *pszString ;
pszString++ ;
}
cout << endl ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Программа сначала проходит по массиву szString с использованием индекса массива. Цикл for прекращает работу, когда индекс достигает значения 5, равного длине строки.
Второй цикл выводит ту же строку с использованием указателя. Программа устанавливает указатель pszString равным адресу первого символа массива. Затем цикл проходит по всем символам строки до тех пор, пока символ, на который указывает pszString , не станет равен false , другими словами, пока указатель не станет указывать на нулевой символ.

«Целое значение 0 в С++ рассматривается какfalse , прочие целочисленные значения — какtrue .»
[ Помни! ]
Программа выводит символ, на который указывает pszString , а затем увеличивает его значение, с тем чтобы указатель указывал на очередной символ строки перед выполнением очередной итерации.

«Разыменование и инкремент могут быть объединены ( обычно так и делается ) в единое выражение следующим образом:
cout << *pszString++ ;
»
[ Помни! ]
Вывод данной программы выглядит так:

Массив ' Randy '
Выводим строку как массив: Randy
Randy Выводим строку с помощью указателя: Randy
Press any key to continue...
_________________
121 стр. Глава 9. Второе знакомство с указателями
Почему при работе со строками пользуются указателями...122
Иногда некоторая запутанность работы с указателями вызывает у читателя вполне резонный вопрос: почему рекомендуется использовать указатели? Иными словами, что делает использование указателя char* предпочтительнее более простого для чтения варианта с массивами и индексами?
Ответ следует искать отчасти в человеческой природе, отчасти в истории развития С++. Компилятор языка С, прародителя С++, в те времена, когда язык появился на свет, был довольно примитивен. Тогда компиляторы не были столь сложными, как сейчас, и не могли так хорошо оптимизировать код. Код while ( *pszTarget++ = *pszSource++ ){ } может показаться читателю сложным, однако после компиляции с помощью даже самого древнего компилятора он будет состоять буквально из нескольких машинных инструкций.
Старые компьютеры были не очень быстрыми по современным меркам. Во времена С экономия нескольких машинных инструкций значила очень много, что и привело к превосходству С над другими языками того времени, такими как FORTRAN, который не поддерживал работу с указателями.
Читать дальше