Почему мы используем [] с указателями, которые указывают на массивы? - PullRequest
0 голосов
/ 20 января 2020

Я новичок в C ++, и мне трудно понять, почему мы используем [] для работы с указателями, которые указывают на массивы.

Насколько я знаю new int[5] возвращает указатель, который указывает на массив размером 5.

Итак, если бы мы сохранили этот указатель в переменной, мы бы сделали: int *arr = new int[5].

Что я не понимаю, так это: если я хочу получить доступ к индексу 0 из этого массива, я бы сделал arr[0].

Почему этот синтаксис правильный? Потому что на мой взгляд arr является указателем, поэтому я должен разыменовать указатель в для доступа к массиву.

Почему бы нам не разыменовать указатель?

По-моему, я бы сделал что-то вроде (*arr)[0], но это неверен.

1 Ответ

6 голосов
/ 20 января 2020

Оператор индекса массива [] неявно разыменовывает указатель.

Это прописано в разделе 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...