Как правило, имя массива распадается на указатель на его первый элемент. Многомерный массив - это просто массив массивов, поэтому, когда у вас есть int a[NUM_ROW][NUM_COL]
, a[i]
- это «имя» i-й строки.
Таким образом, согласно вышеприведенному правилу, a[i]
распадается на указатель на первый элемент этой строки, который равен a[i][0]
. Чтобы создать указатель, мы ставим &
перед выражением, так что &a[i][0]
.
И a
распадается на указатель на первый элемент 2-мерного массива. Каждый элемент основного массива является строкой, а не отдельным целым числом, поэтому a
эквивалентно &a[0]
, а не &a[0][0]
.
Расположение в памяти a[0]
и a[0][0]
одинаковое, разница заключается в типе выражения. Тип a[0][0]
равен int
, но тип a[0]
равен int[NUM_COL]
, который во многих контекстах уменьшится до int *
. Это проще всего увидеть с помощью оператора typeof
:
printf("size of a = %d, size of a[0] = %d, size of a[0][0] = %d\n", sizeof a, sizeof a[0], sizeof a[0][0]);
Если NUM_ROW = 5
и NUM_COL = 10
, вероятно, будет напечатано:
size of a = 200, size of a[0] = 40, size of a[0][0] = 4