Указатели и динамически размещаемые массивы - PullRequest
2 голосов
/ 06 января 2012

Согласно моим заметкам о классе, вы можете выделить массив в C ++, как

int *A = new int[5]

, где A - указатель на массив.

Но тогда вы можете получить доступ к массиву как A[3]. Почему ты можешь это сделать? Разве A не является указателем, а не фактическим массивом?

Ответы [ 4 ]

5 голосов
/ 06 января 2012

Индексирование operator[] фактически определено для работы с указателями, а не с массивами. A[3] на самом деле является синонимом *(A+3). Он работает с массивами как следствие того факта, что массивы могут быть неявно преобразованы в указатели на их первый элемент.

3 голосов
/ 06 января 2012

A [3] - это псевдоним для * (A + 3), который разыменовывает указатель.

1 голос
/ 06 января 2012

Это начальная точка арифметики указателей: вы можете добавлять или вычитать значения с помощью указателей, пока вы не сдвинетесь с массива (ну, вы можете двигаться вверх сразу после массива). По сути, следующее удержание (для A указатель на массив с элементами по крайней мере i + 1:

A[i]
*(A + i)  // this what A[i] means
*(i + A)  // addition is commutative
i[A]       // this sould work, too - and it does!
1 голос
/ 06 января 2012

Вы правы! По сути, это синтаксический сахар, означающий, что разработчики языка создали что-то, чтобы сделать вашу жизнь немного проще, но за кулисами она делает что-то совсем другое. (Этот пункт спорен)

Фактически, это то, что он делает, беря указатель в A, перемещая указатель на 5 int-size вверх, а затем получая значение путем разыменования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...