Я не понимаю, как получился вывод, как это, пожалуйста, объясните
Сначала давайте внесем небольшие изменения в ваш код и напечатаем значения в шестнадцатеричном виде:
int main() {
int v = 10;
char *p = (char*)&v;
int i;
printf("%8d (0x%08x)\n", v, v);
for(i=0; i<sizeof(i); i++, p++)
{
++(*p);
printf("%8d (0x%08x)\n", v, v);
}
return 0;
}
Вывод:
10 (0x0000000a)
11 (0x0000000b)
267 (0x0000010b)
65803 (0x0001010b)
16843019 (0x0101010b)
Итак, что здесь происходит, так это то, что int
составляет четыре байта - следовательно, я получаю 4 значения, напечатанные циклом (плюс печать перед циклом).
Поскольку p
является указателем на символ, а моя система имеет младший порядок, p
сначала будет указывать на младший (младший байт) целого числа, то есть "0a", и увеличивать этот байт до "0b".
Когда p
увеличивается на p++
, он будет указывать на следующий байт, то есть "00", и увеличивать этот байт до "01".Итак, теперь целое число содержит «0000010b» (267 десятичное число).Этот шаг повторяется дважды, так что целое число сначала становится «0001010b» (65803 десятичное число), а затем «0101010b» (16843019 десятичное).
В памяти это выглядит так:
After initialization: 0a 00 00 00
^
|
p
After loop 1: 0b 00 00 00
^
|
p
After loop 2: 0b 01 00 00
^
|
p
After loop 2: 0b 01 01 00
^
|
p
After loop 4: 0b 01 01 01
^
|
p
BTWОбратите внимание, что стандарт не дает никаких гарантий относительно этого поведения.Обновление байтов внутри целого числа с использованием указателя на символ недостаточно хорошо определено стандартом.