2012-01-06 6 views
2

По моему классу примечаний, можно выделить массив в C++ какУказателей и динамически выделенные массивы

int *A = new int[5] 

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

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

+0

, как для типа *. *: А есть типа «указатель на INT» Но он указывает на первый элемент динамически выделенного массива int, да. – sellibitze

ответ

5

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

+1

Я никогда не слышал, чтобы это объяснялось так - аккуратно :) +1. –

+0

@ w00te: на самом деле это не объяснение. Это определение со всеми его последствиями: 3 [A], например. –

3

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

1

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

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

1

Это отправная точка арифметики указателя: вы можете добавлять или вычитать значения с помощью указателей, так как вы не перемещаетесь с массива (ну, вы можете перемещаться вправо после массива). В основном, следующие утверждения (для 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! 
Смежные вопросы