++p
фактически неопределенное поведение, но то, что, похоже, произошло от реализации что sizeof(int*)
равно 4, а нулевой указатель - адрес 0. Напомним, что приращение указателя, когда оно не является UB, добавляет количество байтов к адресу, равному размеру типа referand. Поэтому не удивительно, что когда вы берете нулевой указатель типа int**
(следовательно, тип referand равен int*
) и увеличивайте его, вы попадаете по адресу 4
. Это просто не гарантировано.
Передача указателя, когда формат %d
ожидает int
также неопределенное поведение, но кажется, что представление int
и int**
достаточно совместимы, и переменные аргументы, призывающие конвенции о вашей реализации относится к ним достаточно аналогичным образом, что он успешно напечатан 4
. Это также не очень удивительно для реализаций, где sizeof(int) == sizeof(int**)
, но и не гарантируется.
Конечно, поскольку это неопределенное поведение, есть и другие возможные объяснения того, что вы видите.
«Почему» вы даже беспокоились –
Комментарии коментариев меня путают. –
@ Konrad: Я думаю, что комментарии кода путают автора кода. –