Давайте разберем это немного.
int i = 10;
Теперь у нас есть переменная i
с 10 в ней.Эта переменная имеет длину несколько байтов - скажем, 4 для аргумента (и потому, что это наиболее распространенное значение).10 помещается в один байт, поэтому младший байт будет 10, а остальные будут равны нулю.Но наименее значимый байт может быть первым (с прямым порядком байтов) или последним (с прямым порядком байтов) - это определяется компилятором, базовым процессором и т. Д.
char * ptr = &i;
... является ошибкойили хотя бы предупреждение.Давайте исправим это:
char * ptr = (char *) &i;
Обычно использование указателя неправильного типа равно неопределенное поведение , что означает, что компилятор может выдавать код, который выполняет все, что он хочет для этого.Но есть исключение для char
- вы можете юридически привести любой указатель объекта к char *
(или signed char *
или unsigned char *
).Так что ptr
теперь указывает на первый байт i
.
printf("%d", *ptr);
... не правильно.*ptr
имеет тип char
, но %d
используется для int
.Давайте исправим это:
printf("%hhd", *ptr);
Теперь запомните, что ptr
указывает на первый байт i
.Также помните, что i
имеет байт, равный 10, и несколько байтов, равных нулю, и 10 может быть первым или последним.Таким образом, это печатает или 10 или 0. Какой?Это определяется реализацией .
*ptr = 11;
Если в предыдущей строке было напечатано 10, то первый байт был наименее значимым - вы просто установили значение 11, сделав i
равным 11.
Если в предыдущей строке было напечатано ноль, вы просто устанавливаете самый старший байт в 11. Это установит i
в очень большое значение.