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

int* myPointer = new int[100]; // ... int firstValue = *(myPointer + 0); int secondValue = myPointer[1]; 

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

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

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

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

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

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

но угадайте, что? так как + коммутативна

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

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

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

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

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

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

ОКРУГ КОЛУМБИЯ

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

Кроме того, отладка намного сложнее

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

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

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

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

ОКРУГ КОЛУМБИЯ

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

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

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

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

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

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

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

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

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

  • Swift 2 - UnsafeMutablePointer для объекта
  • Изменение константы int в C ++
  • почему имя массива является указателем на первый элемент массива?
  • Указатели как аргументы функции в C
  • Использование intptr_t вместо void *?
  • Должен ли кто-нибудь установить указатели на «NULL» после освобождения?
  • Что мне нужно сделать, прежде чем удалять элементы в векторе указателей на динамически выделенные объекты?
  • Почему «это» - это указатель, а не ссылка?
  • Является ли хорошей практикой NULL указатель после его удаления?
  • Как бесплатно знать, сколько бесплатно?
  • Как найти «sizeof» (указатель, указывающий на массив)?
  • Interesting Posts

    Инициализация вектора ublas из массива C

    Эквивалент $ compile в Angular 2

    Выбирая n чисел с фиксированной суммой

    Обнаружить, что книга Excel уже открыта

    java.lang.SecurityException: Permission Denial: не разрешено отправлять широковещательную версию android.intent.action.MEDIA_MOUNTED только на KitKat

    Идентификатор автоинкремента Hibernate

    Как включить PAE в Windows 7 (32-разрядная версия) для поддержки более 3,5 ГБ оперативной памяти?

    MongoDB: вспомогательный субподряд

    Марширование коллекции байтов байтов в структуру для вытягивания значений

    Как получить последний автоинкрементный идентификатор из таблицы SQLite?

    Кросс-компиляция mono для руки

    Как реализовать много-много ассоциаций в sequelize

    Обходной путь для ограничения пропускной способности WaitHandle.WaitAll 64?

    Как восстановить GRUB без Live CD?

    Настройте гостевую гостевую систему Virtualbox со статическим IP-адресом, SSH и доступом в Интернет от хоста

    Давайте будем гением компьютера.