Оператор индекса массива []
неявно разыменовывает указатель.
Это прописано в разделе 8.2.1p1 стандарта C ++ 17 :
Выражение E1[E2]
идентично (по определению) *((E1)+(E2))
и разделу 6.5.2.1p2 стандарта C11 :
Определение оператора нижнего индекса []
состоит в том, что E1[E2]
идентичен (*((E1)+(E2)))
Так что, учитывая ваш пример, arr[0]
в точности совпадает с *(arr + 0)
. Значение в скобках добавляется к значению указателя, чтобы указать на нужный элемент массива, и результирующий указатель разыменовывается для получения объекта.
Кроме того, не совсем правильно говорить, что ваш пример указывает на массив, скорее это указывает на первый элемент массива. Указатель на массив будет выглядеть так:
int arr[5];
int (*p)[5] = &arr;
Еще одна вещь, которая может сбить с толку, - это тот факт, что массив в большинстве случаев распадается на указатель на свой первый элемент. Это означает, что вы можете сделать это:
int arr[5];
int *p = arr;
arr[1] = 5; // sets element 1 of arr
p[1] = 7; // also sets element 1 of arr