%p와 %x의 기본 역할
C 또는 C++ 프로그래밍에서 %p는 포인터(메모리 주소) 값을 출력할 때 사용하고, %x는 정수를 16진수 형태로 출력할 때 사용합니다. 포인터 값은 %u나 %x로도 표시할 수 있기 때문에, 두 형식 지정자의 출력 결과가 비슷해 보일 수 있습니다.
눈에 띄는 핵심 차이점
동일한 값을 두 형식 지정자로 출력하면 큰 차이를 느끼지 못할 수 있습니다. 유일하게 확인할 수 있는 차이점은 다음과 같습니다.
- %p: 시스템의 포인터 크기에 맞춰 앞쪽을 0으로 채운(선행 0 padding) 형태로 출력합니다.
- %x: 불필요한 선행 0을 출력하지 않고 순수한 16진수 값만 보여줍니다.
예제 코드
#include<stdio.h>
main() {
int x = 59;
printf("Value using %%p: %p\n", x);
printf("Value using %%x: %x\n", x);
}실행 결과
Value using %p: 000000000000003B Value using %x: 3b
추가로 알아두면 좋은 점
%p는void*타입의 인자를 기대하고,%x는unsigned int타입을 기대합니다. 특히 64비트 시스템에서 포인터를%x로 출력하면 상위 비트가 잘려 잘못된 주소가 표시될 수 있으므로 주의해야 합니다.- 대문자 16진수(A~F)로 출력하고 싶다면
%X를 사용하면 됩니다. - 이식성(portability)을 고려한다면 포인터 출력에는 반드시
%p를 사용하는 것이 안전합니다.