Строка 3 просто указывает x
на адрес a
. Как специальное правило в C, нам разрешено использовать символьные указатели специально для доступа к отдельным байтам любой другой переменной.
Дальнейший доступ к x
изменит отдельные байты a
, таким образом, что это зависит от состояния процессора. На машине с прямым порядком байтов 512 = 0x200, где два младших байта имеют значения 0x00 и 0x02 соответственно. x[0] = 1;
изменяет младший байт на 0x01, а x[1] = 2;
записывает значение 0x02 в байт, который уже содержал 0x02. Результат будет 0x201 = 513 десятичных.
Проблема здесь в том, что printf("%d\n");
вызывает неопределенное поведение, поскольку содержит неверное количество параметров.
Краткое содержание: код - бред, и язык Си не определяет, что будет делать эта программа. Может произойти сбой, распечатать любое значение или напечатать вообще никакого значения. Размышление о том, почему оно ведет себя определенным образом, не имеет смысла. Вместо этого сосредоточьтесь на изучении того, как избежать неопределенных ошибок в поведении.