Стефан Дэвис - С++ для чайников .

Тут можно читать онлайн Стефан Дэвис - С++ для чайников . - бесплатно полную версию книги (целиком) без сокращений. Жанр: sci_tech, издательство Издательский дом Вильямс. Компьютерное издательство Диалектика, год 2007. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.
  • Название:
    С++ для чайников .
  • Автор:
  • Жанр:
  • Издательство:
    Издательский дом Вильямс. Компьютерное издательство Диалектика
  • Год:
    2007
  • Город:
    Москва
  • ISBN:
    0-7645-6852-3, 978-5-8459-0723-3
  • Рейтинг:
    4/5. Голосов: 11
  • Избранное:
    Добавить в избранное
  • Отзывы:
  • Ваша оценка:
    • 80
    • 1
    • 2
    • 3
    • 4
    • 5

Стефан Дэвис - С++ для чайников . краткое содержание

С++ для чайников . - описание и краткое содержание, автор Стефан Дэвис, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
empty-line
1
empty-line
4

С++ для чайников . - читать онлайн бесплатно полную версию (весь текст целиком)

С++ для чайников . - читать книгу онлайн бесплатно, автор Стефан Дэвис
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

pointer-offset — Указатель — Операция, противоположная сложению

pointer2-pointer1 — Смещение — Вычисляет количество элементов между pointer1 и pointer2

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

В этой таблице offset имеет тип int ( здесь не приведены операции, близкие к сложению и вычитанию, такие как ++ и +=, которые также могут применяться к указателям ).

Модель памяти, построенная на примере домов ( так эффективно использованная в предыдущей главе ), поможет понять, как работают приведённые в таблице операции с указателями. Представьте себе квартал, в котором все дома пронумерованы по порядку. Дом, следующий за домом 123 Main Street, будет иметь адрес 124 Main Street ( или 122 Main Street, если вы идёте в противоположную сторону, поскольку вы левша или живёте в Англии ).

Очевидно, что в таком случае через четыре дома от моего будет находиться дом с адресом 127 Main Street. Адрес этого дома можно записать как

123 Main Street + 4 = 127 Main Street

_________________

117 стр. Глава 9. Второе знакомство с указателями

И наоборот, если поинтересоваться, сколько домов находится между домом 123 и 127, ответом будет четыре:

127 Main Street - 123 Main Street = 4

Понятно, что любой дом находится относительно самого себя на расстоянии нуль домов:

123 Main Street - 123 Main Street = 0

Продолжая рассуждения, становится понятно, что складывать дома 123 и 127 не имеет никакого смысла. Соответственно, суммирование двух указателей является в С++ некорректной операцией. Вы также не можете умножать или делить адреса, возводить их в квадрат или извлекать квадратный корень — словом, надеюсь, вы поняли, что я хотел сказать.

Повторное знакомство с массивами в свете указателей...118

Обратимся к странному и мистическому миру массивов. Ещё раз воспользуемся в качестве примера домами моих соседей. Массив тоже очень похож на городской квартал. Каждый элемент массива выступает в качестве дома в этом квартале. Дома — элементы массива — отсчитываются по порядку от начала квартала. Дом на углу улицы отстоит на 0 домов от угла, следующий дом отстоит на 1 дом от угла и т.д. Пользуясь терминологией массивов, можно сказать, что cityBlock[ 0 ] представляет собой дом по адресу 123 Main Street, cityBlock[ 1 ] — дом по адресу 124 Main Street и т.д.

Теперь представим себе массив из 32-х однобайтовых значений, имеющий имя charArray . Если первый элемент массива находится по адресу 0x110 , тогда массив будет продолжаться вплоть до адреса 0x12f. Таким образом, элемент массива charArray[ 0 ] находится по адресу 0x110 , charArray[ 1 ] — по адресу 0x111 , charArray[ 2 ] — по адресу 0x112 и т.д.

Можно создать указатель ptr на нулевой элемент массива. После выполнения строки ptr = & charArray[ 0 ] ; указатель ptr будет содержать адрес 0x110. Можно прибавить к этому адресу целочисленное смещение и перейти к необходимому элементу массива. Операции над массивами с использованием указателей приведены в табл. 9.2. Эта таблица демонстрирует, каким образом добавление смещения n вызывает переход к следующему элементу массива charArray .

Таблица 9.2. Добавление смещения

_________________

Смещение — Результат — Соответствует

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

+0 — 0x110 — charArray[ 0 ]

+1 — 0x111 — charArray[ 1 ]

+2 — 0x112 — charArray[ 2]

... — ... — ...

+n — 0х110+n — charArray[ n ]

¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

Как видите, добавление смещения к указателю на массив равнозначно переходу к соответствующему значению.

Таким образом, если char* ptr& charArray[ 0 ] ;, то *( ptr + n ) соответствует элементу charArray [ n ] .

Поскольку имеет более высокий приоритет чем сложение операцияptr n - фото 133

«Поскольку * имеет более высокий приоритет, чем сложение, операция*ptr + n привела бы к сложениюn со значением, на которое указываетptr . Чтобы выполнить сначала сложение и лишь затем переход к переменной по указателю, следует использовать скобки. Выражение*( ptr + n ) возвращает элемент, который находится по адресуptr плюсn элементов.»

[ Атас! ]

_________________

118 стр. Часть 2. Становимся функциональными программистами

В действительности соответствие между двумя формами выражений настолько строго, что С++ рассматривает элемент массива array[ n ] как *( ptr + n ), где ptr указывает на первый элемент array. С++ интерпретирует array[ n ] как *( & аrray [ 0 ] +n ). Таким образом, если дано char charArray[ 20 ] , то charArray определяется как & charArray[ 0 ] .

Имя массива, записанное без индекса элемента, интерпретируется как адрес нулевого элемента массива ( или просто адрес массива ). Таким образом, можно упростить приведённую выше запись, поскольку array[ n ] С++ интерпретирует как *( array + n ) .

Использование операций над указателями для адресации внутри массива...119

Концепция соответствия между индексацией массива и арифметикой указателей весьма полезна.

Например, функция displayArray( ) , которая выводит содержимое целочисленного массива, может быть реализована следующим образом:

/* displayArray — отображает элементы массива, имеющего длину nSize */

void displayArray( int intArray[ ] , int nSize )

{

cout << "Значения элементов массива равны:\n" ;

for ( int n = 0 ; n < nSize ; n++ )

{

cout << n << ": " << intArray[ n ] << "\n" ;

}

cout << "\n" ;

}

Эта версия функции использует операции над массивами, которые знакомы нам по предыдущим главам. Если воспользоваться для написания этой функции указателями, программа приобретёт такой вид:

/* displayArray — отображает элементы массива, имеющего длину nSize */

void displayArray( int intArray[ ] , int nSize )

{

cout << "Значения элементов массива равны:\n" ;

int* pArray = intArray ;

for ( int n = 0 ; n < nSize ; n++ , pArray++ )

{

cout << n << ": " << *pArray << "\n" ;

}

cout << "\n" ;

}

Этот вариант функции displayArray начинается с создания указателя на первый элемент массива intArray .

Буквар в начале имени переменной означает что эта переменная является - фото 134

«Буквар в начале имени переменной означает, что эта переменная является указателем, однако это только соглашение, а не стандарт языка С++.»

[ Помни! ]

_________________

119 стр. Глава 9. Второе знакомство с указателями

После этого функция считывает все элементы массива по порядку. При каждом выполнении оператора for происходит вывод текущего элемента из массива intArray . Этот элемент находится по адресу рArray , который увеличивается на единицу при каждом выполнении цикла.

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Стефан Дэвис читать все книги автора по порядку

Стефан Дэвис - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




С++ для чайников . отзывы


Отзывы читателей о книге С++ для чайников ., автор: Стефан Дэвис. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x