ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн

Указатели и массивы

Указатели и массивы очень похожи. В главе 7 «Массивы и строки» мы рассмот- рели, как можно получить доступ к элементам массива. Вспомним это на приме- ре ARRNOTE:

// arrnote.cpp

// обычный доступ к элементам массива

#include <iostream>

using namespace std;

 

int main ( )

{

  int intarray [ 5 ] = { 31, 54, 77, 52, 93 }; // набор целых чисел

 

  for ( int j = 0; j < 5; j++ )     // для каждого элемента массива

    cout << intarray [ j ] << endl; // напечатаем его значение

 

  return 0;

}

Функция cout выводит элементы массива по очереди. Например, при j, рав- ном 3, выражение intarray [j] принимает значение intarray[3], получая доступ к четвертому элементу массива, числу 52. Рассмотрим результат работы програм- мы ARRNOTE:

31 54 77 52 93

Необычно то, что доступ к элементам массива можно получить как исполь- зуя операции с массивами, так и используя указатели. Следующий пример PTRNOTE похож на пример ARRNOTE, за исключением того, что в нем используют- ся указатели.

// ptrnote.cpp

// доступ к элементам массива через указатель

#include <iostream>

using namespace std;

 

int main ( )

{

  int intarray [ 5 ] = { 31, 54, 77, 52, 93 }; // набор целых чисел

 

  for ( int j = 0; j < 5; j++ )        // для каждого элемента массива

    cout << *( intarray + j ) << endl; // напечатаем его значение

 

  return 0;

}

 

Результат действия выражения * (intarray+j) — тот же, что и выражения intarray[j] в программе ARRNOTE, при этом результат работы программ одинаков. Что же представляет из себя выражение *(intarray+j)? Допустим, j равно 3, тогда это выражение превратится в *(intarray+3). Мы предполагаем, что оно содержит в себе значение четвертого элемента массива (52). Вспомним, что имя массива является его адресом. Таким образом, выражение intarray+j — это адрес чего-то в массиве. Вы можете ожидать, что intarray+З будет означать 3 байта массива intarray. Но это не даст нам результат, который мы хотим получить: intarray — это массив элементов типа int, и три байта в этом массиве — середина второго элемента, что не очень полезно для нас. Мы хотим получить четвертый элемент массива, а не его четвертый байт, что показано на рис. 10.5 (на этом рисунке int занимает 2 байта).

Рис. 10.5. Отсчет no int

Компилятору C++ достаточно получить размер данных в счетчике для вы- полнения вычислений с адресами данных. Ему известно, что intarray — массив

 

типа int. Поэтому, видя выражение intarray+3, компилятор интерпретирует его как адрес четвертого элемента массива, а не четвертого байта.

Но нам необходимо значение четвертого элемента, а не его адрес. Для его по- лучения мы используем операцию разыменования (*). Поэтому результатом вы- ражения *(intarray+3) будет значение четвертого элемента массива, то есть 52.

Теперь рассмотрим, почему при объявлении указателя мы должны указать тип переменной, на которую он будет указывать. Компилятору необходимо знать, на переменные какого типа указывает указатель, чтобы осуществлять правиль- ный доступ к элементам массива. Он умножает значение индекса на 2, в случае типа int, или на 8, в случае типа double.

 

10