C выкладывает многомерные массивы плоскими, если по крайней мере все, кроме последнего измерения известны во время компиляции - так что int[3][3]
на самом деле просто и int[9]
массив в памяти - только тип отличается.
Таким образом, поскольку массив молча преобразуется в указатель на свой первый элемент при использовании в большинстве выражений, *arr
всегда эквивалентно arr [0] для всех массивов.
В этом случае arr
(два уровня косвенности на int) - указатель на первый массив int[3]
, *arr==arr[0]
(1 уровень косвенности на int) - указатель на первое целое число в первом int[3]
массив, поскольку вся структура «плоская», этот первый int[3]
начинается точно в том же месте, что и массив int[3][3]
.
Это немного сбивает с толку, но в памяти это всего лишь 9 целых чисел подряд, которые "знает" компилятор, следует рассматривать как блоки из 3
если ячейки указаны ниже:
|0|1|2|3|4|5|6|7|8|
тогда arr
- указатель на | 0 |, arr+1
- указатель на | 3 | и arr+2
- указатель на | 6 |
arr[0]
ТАКЖЕ указатель на | 0 |, arr[0]+1
указатель на | 1 |, arr[0]+2
указатель на | 2 | и так далее...
Поскольку arr[0]
всегда идентичен *arr
для любого массива, *arr
ТАКЖЕ является указателем на | 0 |