Стефан Дэвис - С++ для чайников .
- Название:С++ для чайников .
- Автор:
- Жанр:
- Издательство:Издательский дом Вильямс. Компьютерное издательство Диалектика
- Год:2007
- Город:Москва
- ISBN:0-7645-6852-3, 978-5-8459-0723-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Стефан Дэвис - С++ для чайников . краткое содержание
1
empty-line
4
С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Убедиться в работоспособности описанной функции можно, используя её в следующей функции main( ) :
int main( int nNumberOfArgs , char* pszArgs[ ] )
{
int array[ ] = { 4 , 3 , 2 , 1 } ;
displayArray( array , 4 ) ;
/* Пауза для того, чтобы посмотреть на результат работы программы */
system( "PAUSE" ) ; return 0 ;
}
Результат работы этой программы имеет следующий вид:
Значения элементов массива равны:
0: 4
1: 3
2: 2
3: 1
Press any key to continue...
Можно сказать, что функция почти не изменилась и выполняет такие же операции, как и предыдущая версия, однако использование указателей — более распространённая практика, чем работа с массивами. По ряду причин программисты избегают работать с массивами. Чаще всего указатели используются для работы с символьными массивами.
Использование указателей для работы со строками...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, который не поддерживал работу с указателями.
Именно тогда и зародилась традиция писать компактные и эффективные, правда, подчас несколько загадочные на вид программы на С++, и с тех пор никто не хочет возвращаться к индексам.
«Не надейтесь, что, написав сложное и запутанное выражение на С++, вы сэкономите несколько машинных команд. В С++ нет прямой связи между количеством команд в исходном и конечном коде.»
[ Советы ]
Операции с указателями других типов...122
Нетрудно сообразить, что szTarget+n указывает на элемент szTarget[ n ] , если szTarget является массивом однобайтовых значений. Если szTarget начинается по адресу 0x100 , то шестой элемент массива будет находиться по адресу 0x105.
Однако положение элемента в массиве становится не столь очевидным, если массив состоит из элементов типа int , которые занимают по четыре байта каждый. Если первый элемент такого массива находится по адресу 0x100 , то шестой будет находиться по адресу 0x114( 0x100 + ( 5 * 4 ) = 0x114 ) .
Читать дальшеИнтервал:
Закладка: