Если мы «нарисуем» массив arr
на бумаге, он будет выглядеть следующим образом
+-----------+-----------+-----------+-----------+-----------+-----+
| arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] | arr[1][0] | ... |
+-----------+-----------+-----------+-----------+-----------+-----+
Из этого должно быть легко увидеть, что указатели на массив, первый элемент массива,и первый подэлемент первого элемента все будет одинаковым.
То есть &arr == &arr[0]
и &arr[0] == &arr[0][0]
(что, конечно, означает, что &arr == &arr[0][0]
).
Различия здесь имеют типы:
&arr
относится к типу int (*)[3][4]
&arr[0]
относится к типу int (*)[4]
- А
&arr[0][0]
относится к типу int *
Теперь, что касается arr
и *arr
, вы должны помнить, что массивы естественным образом распадаются на указатели на свои первые элементы.Это означает, что arr
будет равно &arr[0]
.И разыменование указателя будет «значением», на которое указывают, так что *arr
равно *(&arr[0]
), что затем равно arr[0]
, что, в свою очередь, уменьшится до &arr[0][0]
.