Разница между * (указатель + указатель) и указатель []

int* myPointer = new int[100];

// ...

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

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

 *(10 + array); //is all the same
 10[array]; //! it true try it !

Ответ 3

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

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

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

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

Ответ 4

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

DC

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

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

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

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

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

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

DC

Ответ 5

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

int parse_line(char* line) 
{
    char* p = line;
    while(*p)
    {
         // consume
         p++;
    }
    ...
}

Ответ 6

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

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

Ответ 7

Фактически, когда Array 'a' инициализируется указателем на его первое место памяти, то есть возвращается a [0], которое является не чем иным;

Итак, если вы делаете "+ 1", это на самом деле указатель на [1]

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

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

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