Разница между * (указатель + указатель) и указатель []
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],
Так что я думаю, что его довольно ясно, как это работает.