ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 10) онлайн
Указатели-константы и указатели-переменные
Предположим, что мы хотим использовать операцию увеличения вместо прибав- ления шага j к имени intarray. Можем ли мы записать *(intarray++)?
Сделать так мы не можем, поскольку нельзя изменять константы. Выраже- ние intarray является адресом в памяти, где ваш массив будет храниться до окон- чания работы программы, поэтому intarray — это указатель константы. Мы не можем сказать intarray++, так же как не можем сказать 7++. (В многозадачных системах адресная переменная может менять свое значение в течение выполне- ния программы. Активная программа может обмениваться данными с диском, а затем снова загружать их уже в другие участки памяти. Однако этот процесс невидим в нашей программе.)
Мы не можем увеличивать адрес, но можем увеличить указатель, который содержит этот адрес. В примере PTRINC мы покажем, как это работает:
// ptrinc.cpp
// доступ к массиву через указатель
#include <iostream>
using namespace std;
int main ( )
{
int intarray [ 5 ] = { 31, 54, 77, 52, 93 }; // набор целых чисел
int* ptrint; // указатель на int
ptrint = intarray; // пусть он указывает на наш массив
for( int j = 0; j < 5; j++ ) // для каждого элемента массива
cout << *( ptrint++ ) << endl; // напечатаем его значение
return 0;
}
Здесь мы определили указатель на int — ptrint — и затем присвоили ему зна- чение адреса массива intarray. Теперь мы можем получить доступ к элементам массива, используя выражение
*( ptrint++ )
Переменная ptrint имеет тот же адрес, что и intarray, поэтому доступ к перво- му элементу массива intarray[0], значением которого является 31, мы можем осу- ществлять, как и раньше. Но так как переменная ptrint не является константой, то мы можем ее увеличивать. После увеличения она уже будет показывать на второй элемент массива intarray[1]. Значение этого элемента массива мы можем получить, используя выражение *(ptrint++). Продолжая увеличивать ptrint, мы можем получить доступ к каждому из элементов массива по очереди. Результат работы программы PTRINC будет тем же, что и программы PTRNOTE.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
