Разница между * (указатель + индекс) и указатель [] - PullRequest
24 голосов
/ 07 января 2011
int* myPointer = new int[100];

// ...

int firstValue = *(myPointer + 0);
int secondValue = myPointer[1];

Есть ли функциональная разница между *(myPointer + index) и myPointer[index]? Что считается лучшей практикой?

Ответы [ 7 ]

41 голосов
/ 07 января 2011

Функционально они идентичны.

Семантически разыменование указателя говорит: «Вот вещь, но я действительно забочусь о том, что X пробел», в то время как доступ к массиву говорит: «Вот куча вещей, я забочусь о Xth.

В большинстве случаев я бы предпочел форму массива.

21 голосов
/ 07 января 2011

Нет разницы между

*(array+10); //and
array[10];

но угадайте что? поскольку + является коммутативным

 *(10 + array); //is all the same
 10[array]; //! it's true try it !
12 голосов
/ 07 января 2011

Нет, они функционально эквивалентны.

Сначала index масштабируется до размера шрифта, затем добавляется к базе myPointer, затем значение извлекается из этой ячейки памяти.

«Лучшая практика» - более читабельная, обычно, но не всегда, вариант myPointer[index].

Это потому, что вас обычно интересует элемент массива, а не место в памяти для разыменования.

3 голосов
/ 07 января 2011

Функциональных различий, о которых я знаю, нет, но форма myPointer[1], в конечном счете, более читабельна и гораздо менее подвержена ошибкам кодирования.

DC

Форма *(myPointer + 1) не позволяет изменять тип указателя на объект и, следовательно, получать доступ к перегруженному оператору [].

Также отладка намного сложнее

 int *ints[10];
 int myint = ints[10]; 

легче подобрать визуально, чем

 int *ints;
 int myint = *(ints + 10); 

также компилятор может вставить проверку диапазона, чтобы перехватить ошибку во время компиляции.

DC

1 голос
/ 07 января 2011

Функциональной разницы нет.Решение об использовании любой формы обычно принимается в зависимости от контекста, в котором вы ее используете.Теперь в этом примере форму массива проще использовать и читать, и, следовательно, это очевидный выбор.Однако предположим, что вы обрабатывали массив символов, скажем, потребляя слова в предложении.Используя указатель на массив, вам может быть проще использовать вторую форму, как показано во фрагменте кода ниже:

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}
1 голос
/ 07 января 2011

Более читабельный и более понятный код - лучший код.

Что касается функциональной части ... Разницы нет.Оба раза вы «играете с памятью».

0 голосов
/ 08 октября 2017

На самом деле, когда массив 'a' инициализируется, указатель на его первую ячейку памяти, т. Е. Возвращается [0], который является ничем иным, как a;

Так что если вы делаете 'a + 1', то это фактически указатель на [1]

, если вы делаете 'a + 2', это фактически указатель на [2]

если вы делаете 'a + 3', это на самом деле указатель на [3] и так далее,

, поэтому, если вы сделаете * (a + 1), вы получите значение [1] и аналогично для других значений.если вы сделаете * (a), то на самом деле получите [0], так что я думаю, теперь довольно ясно, как это работает ..

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