
Пример 19. Вывод адресов ячеек массивов целого и вещественного типов
int a[4], *ptra, i;
float b[4], *ptrb;
ptra=a; //присваивает указателю адрес массива а
ptrb=b; // присваивает указателю адрес массива b
for(i=0; i<4; i++)
cout <<"Адрес ячейки массива а+"<<i<<": "<<(ptra+i)<<" массива b+"<<i<<": ""<<(ptrb+i) <<"\n";
На экране монитора появится, например, следующий результат:
Адрес ячейки массива а+0: 0х2е2112b2 массива b+0: 0х2е2112с0
Адрес ячейки массива а+1: 0х2е2112b4 массива b+1: 0x2e2112с4
Адрес ячейки массива а+2: 0х2е2112b6 массива b+2: 0x2e2112с8
Адрес ячейки массива а+3: 0х2е2112b8 массива b+3: 0x2e2112сс
Возникает вопрос:
почему 0x2e2112b2+1=0x2e2112b4 или почему 0х2е2112с0+1= 0х2е2112с4?
Такая ситуация возникает из-за того, что единицей адресации в первом случае является тип int (размер — 2 байта). Во втором случае для типа float единица адресации имеет размер 4 байта.
Прибавление единицы к указателю означает переход к следующему элементу массива независимо от типа его элементов.
Поэтому при объявлении указателей необходимо записывать тип объекта, чтобы компилятору было известно, сколько байтов добавлять к адресу при увеличении указателя на единицу.
Работа с указателями из рассмотренного примера графически изображена на рис. 1.
Рис. 1. Работа с указателями
Указатели и многомерные массивы
Для начала рассмотрим пример объявления двумерного массива:
int mas[4][2];
int *ptr;
Выражение ptr=mas указывает на первый столбец первой строки матрицы (записи mas и &mas[0][0] равносильны).
Выражение ptr+1 указывает на mas[0][1], ptr+2 указывает на mas[1][0], ptr+3 – на mas[1][1], и т.д. ptr+7 указывает на mas[3][1].
Многомерные массивы, как и одномерные располагаются на непрерывном участке памяти, занимая последовательные ячейки таким образом, что самый правый индекс изменяется первым.
Двумерный массив, например, располагается на непрерывном участке памяти в виде последовательности строк, идущих друг за другом (рис. 2).
mas[0][0] ptr=mas |
mas[0][1] ptr+1 |
mas[1][0] ptr+2 |
mas[1][1] ptr+3 |
mas[2][0] ptr+4 |
mas[2][1] ptr+5 |
mas[3][0] ptr+6 |
mas[3][1] ptr+7 |
Рис. 2. Размещение двумерного массива в памяти