2016-02-25 5 views
-4

Как-то эти арифметические указатели меня очень смущают. Пример:Указатель Арифметика и литье

uint16_t *a = (uint16_t *)0x200; 
a += 4 * sizeof(uint32_t); 

При расчете нового значения, каков ваш мыслительный процесс?

Это, как я пытаюсь понять это:

  1. указатель (а) указывает на адрес, который имеет значение 0x200 типа uint16_t.
  2. Вторая операция перемещает указатель a на + 4 * 8 байтов в место 32 байта (20 в гексагоне) вверх, что, по-видимому, 0x220. Почему это не & a + 32? Я думаю, что это то, где я путаю вещи ... Почему указатель указывает на 0x200, а не & a?
+0

Выберите между 'C++' и 'C'. Они разные, поэтому, пожалуйста, пометьте свой вопрос только одним из них. –

+0

c или C++? Выберите один – Magisch

+1

Я думал, что в этом случае это было действительно на обоих языках ... Наверное, я просто буду использовать C++. – Space

ответ

2

Аппликация указателя указана в единицах типа, на который указывают.

Так что, если вы только что сделали ++a;, новое значение a будет 0x202, не0x201.

Итак, когда вы добавляете 4 * sizeof (uint32_t), это то же самое, что и добавление 2 * 4 * 4, то есть 32, которое является шестнадцатеричным 0x20. Таким образом, новое значение - 0x220.

+0

Спасибо. Это был именно тот ответ, который я искал. – Space

Смежные вопросы