c ++ использование ptr в качестве базы массива - PullRequest
0 голосов
/ 30 января 2010

На странице 42 в Effective C ++ указатель используется как имя массива ala

AirPlane * newBlock = ...

newBlock [I] .next = 0;

Я не знал, что это законно. Это часть стандарта с ++? Это обычная практика?

Ответы [ 3 ]

5 голосов
/ 30 января 2010

Да, указатели могут использоваться для динамического выделения массивов объектов .

Из этого и других вопросов видно, что вы новичок в C ++. Поэтому начинать с "Effective C ++" не самая лучшая идея. Хотя это отличная книга, она наиболее полезна для людей, уже знакомых с языком. Вам следует начать с вводной книги или учебного пособия, пройтись по ним, написать некоторый код и только потом перейти к «Эффективному C ++».

2 голосов
/ 30 января 2010

Я бы повторил ответ, который я дал на аналогичный вопрос C строки путаницы :

Это действительно сбивает с толку. Важный вещь, чтобы понять и отличить это это имя символа [] объявляет массив и char * name объявляет указатель Два разные животные.

Однако массив в C может быть неявно преобразован в указатель на свой первый элемент. Это дает вам возможность выполнять арифметику указателя и повторять через элементы массива (это не материальные элементы какого типа, символ или не). Как уже упоминалось, вы можете использовать оба, оператор индексации или указатель арифметика для доступа к элементам массива. На самом деле, оператор индексации это просто синтаксический сахар (другой представление одного и того же выражения) для арифметики указателей.

Те же самые правила определены в стандарте C ++.

Также взгляните на Является ли имя массива указателем в C?

2 голосов
/ 30 января 2010

С http://www.cplusplus.com/doc/tutorial/pointers/:

В главе о массивах мы использовали скобки ([]) несколько раз по порядку указать индекс элемента массив, на который мы хотели сослаться. Ну, эти операторы со скобками [] также известны оператор разыменования как оператор смещения. Они разыменовывают переменная, за которой они следуют так же, как * делает, но они также добавляют число в скобках по указанному адресу разыменовываются. Например:

a[5] = 0;       // a [offset of 5] = 0
*(a+5) = 0;     // pointed by (a+5) = 0 

Эти два выражения эквивалентны и действует как если указатель или если а является массивом.

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