- •Указатели
- •Объявление указателей
- •Доступ к объекту через указатель
- •Инициализация указателей
- •Указатель на неопределенный тип
- •Выражения с указателями
- •Операции с указателями
- •Указатели и массивы
- •Нехватка памяти
- •Указатели и многомерные массивы
- •Использование указателей вместо двумерного массива
- •Свободные массивы и указатели
Указатели и многомерные массивы
Многомерный массив в С – это массив массивов. Например:
int mas[ m ][ n ][ k ] ;
Можно сказать , что объявлен одномерный массив из m элементов, каждый элемент которого является двумерным массивом, содержащим n*k элементов. В памяти это массив будет расположен так:
m
массивов n*k
Двумерный массив n*k, в свою очередь, расположен в памяти по строкам:
n строк
(одномерных массивов по k
элементов в каждом)
первая строка вторая строка n– ая строка
Наиболее часто в программах уаотребляются двумерные массивы, плзволяющие обрабатывать данные, пердставленные в табличной форме. Например, если объявлен двумерный массив
int a[ 5 ] [ 4 ];
то это объявление можно рассматривать как объявление одномерного массива а, состоящего из пяти элементов, каждый элемент которого, в свою очередь, состоит из четырех элементов.
Имя массива а – это указатель на одномерный массив целых из пяти элементов, каждый из которых содержит адрес соответствующей строки массива. Значение а - адрес первой строки массива.
Так как имя двумерного массива является указателем на массив, то его можно проиндексировать:
a[0] – это адрес строки с индексом 0,
a[1] – это адрес строки с индексом 1,
a[2] – это адрес строки с индексом 2,
a[3] – это адрес строки с индексом 3,
a[4] – это адрес строки с индексом 4.
Это означает, что каждый элемент массива а указывает на соответствующую строку, что схематично можно отобразить так:
a[0][0] a[0][1] a[0][2] a[0][3]
a[1][0]
a[1][1] a[1][2] a[1][3]
a[2][0 ] a[2][1] a[2][2] a[2][3]
a[3][0]
a[3][1] a[3][2] a[3][3]
a[4][0]
a[4][1] a[4][2] a[4][3]
a[0]
a[1]
a[2]
a[3]
a[4]
Так как a[0] – это адрес строки с индексом 0, а a[i] – это адрес строки с индексом i, то можно записать:
a [0] = & a [0] [0]; …. a[i] = & a[i] [0];
Но а[i] эквивалентно *(a + i) - это адрес строки с индексом i, он смещен от адреса начала на
i * 4*sizeof (int) байт , ( 4 –это количество элементов в строке, или столбцов матрицы).
Для получения адреса элемента двумерного массива, находящегося в строке с индексом i и столбце с индексом j следует к адресу строки матрицы добавить смещение элемента по строке:
*(a + i) + j - это то же, что и & a [ i ] [ j ]
Для получения значения элемента двумерного массива, находящегося в строке с индексом i и столбце с индексом j следует к адресу элемента применить операцию разадресации:
* (*(a + i) + j ) - это то же, что и a [ i ] [ j ]
В общем случае вычисление смещения элемента двумерного массива, объявленного как
a [ m ] [ n ] следует выполнять по фомуле:
n * i + j, где
n – количество столбцов массива (или элементов в строке);
i – текущий индекс строки;
j– текущий индекс столбца.
