Указатели на символы, указывающие на переменную int - PullRequest
0 голосов
/ 17 марта 2019
int i=10;
char *ptr = &i;
printf("%d",*ptr); // what will be the output and why
*ptr =11; //now what will be the output and why

Может кто-нибудь помочь мне с этим ?? Я получаю другой вывод, и я не знаю почему. Может кто-нибудь объяснить мне, что здесь происходит и почему ??

1 Ответ

3 голосов
/ 17 марта 2019

Давайте разберем это немного.

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 в очень большое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...