Вопрос 1, это определения указателя p
. Один инициализирует указатель на NULL
, другой оставляет его неинициализированным (если это локальная переменная в функции, а не глобальная переменная, глобальные переменные по умолчанию инициализируются 0). Инициализация с помощью NULL
может быть хорошей, или это может быть плохо, потому что компилятор может предупредить вас об использовании неинициализированных переменных и помочь вам найти ошибки. С другой стороны, компилятор не может обнаружить все возможное использование неинициализированной переменной, поэтому инициализация до NULL
в значительной степени гарантирует получение ошибки сегментации, если она используется, которую вы можете легко поймать и отладить отладчиком очень легко. Лично я бы всегда начинал инициализацию, когда определялась переменная, с правильным значением, если это возможно (если инициализация слишком сложна для одного оператора, добавьте вспомогательную функцию для получения значения).
Вопрос 2, %p
печатает значение адреса, переданное printf
. Так printf("%p", pointer);
получает значение переменной pointer
, и оно печатает это, в то время как printf("%p", &pointer);
(обратите внимание, что дополнительный &
там) получает переданный адрес переменной pointer
, и он печатает это. Точный числовой формат %p
- это реализация, она может быть напечатана просто как простой номер.
Вопрос 3 о неопределенном поведении, поскольку в строке формата есть больше предметов, чем то, что вы фактически переходите на printf
. Короткий ответ: поведение не определено, нет «почему». Более длинный ответ: запустите приложение с помощью отладчика машинного кода и проследите за выполнением в режиме разборки, чтобы узнать, что на самом деле происходит, чтобы понять, почему. Обратите внимание, что результаты могут отличаться для разных прогонов, и поведение может отличаться в зависимости от отладчика и работает нормально, потому что память может иметь разные значения байтов в разных прогонах по разным причинам.
Он печатает адрес, содержащий указатель, а не адрес переменной указателя. – Barmar