Задать вопрос
@NikHaker
/

Чему будет равно i при таком необычном указателе?

Попалась такая интересная задачка:
uint32_t *i = 1024;
i++;

Чему равно i?

Примечательно, что указатель здесь инициализируется не обычным методом. В коде ошибок нет, это гарантированно.
VS и Code::Blocks компилить отказываются. В чем тут суть, поясните пожалуйста.
  • Вопрос задан
  • 677 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
1028. При инкременте указателя к нему добавляется sizeof от того, на что он указывает, то есть
i++;
эквивалентно
(int&)i += sizeof(uint32_t);

По поводу скомпилировать, если задать язык как C, а не C++, то он это проглотит, так как менее строгий в плане приведения типов (целое число приводить к указателю не безопасно). Чтобы скомпилировать в C++, нужно немного подправить код.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Это на будущее. Char занимает 1 байт, так что адрес увеличится на 1 в шестнадцатеричном представлении, если к char прибавить 1, а если прибавить 1 к int1, как и к uint32_t(они оба занимают по 4 байта), то адрес увеличится на 4(был 0xAAFFAACB, а станет 0xAAFFAACF), тип double занимает 8 байт, то есть если, например, переменная типа double занимала адрес 0x123AB111, то будет занимать 0x123AB119 при увеличении указателя на 1.
"К указателям могут применяться только две арифметические операции: сложение и вычитание. Для понимания арифметических действий с указателями предположим, что p1 - это указатель на целое, содержащий значение 2000, и будем считать, что целые имеют длину 2 байта. После выражения

p1 ++;

содержимое p1 станет 2002, а не 2001! Каждый раз при увеличении p1 указатель будет указывать на следующее целое. Это справедливо и для уменьшения. Например:

р1 --;

приведет к тому, что p1 получит значение 1998, если считать, что раньше было 2000

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

p1 = p1 + 9;

приводит к тому, что указатель p1 указывает на девятый элемент по сравнению с элементом, на который он указывал до присваивания.

Помимо добавления или вычитания указателей и целых чисел, единственную операцию, которую можно выполнять с указателями, - это вычитание одного указателя из другого.
."100120ea0ab7436d8bd981033bea675e.png
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы