В конце концов, оба этих оператора делают то же самое...
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
Например (с различными адресами):
0012FEE0
0012FEE0
Это тривиально для форматирования указателя, как желаемый с %x
, так есть ли некоторое хорошее использование %p
опция?
Они не делают то же самое. Последний оператор printf
интерпретирует b
как unsigned int
, что неверно, поскольку b
является указателем.
Указатели и unsigned int
не всегда имеют одинаковый размер, поэтому они не взаимозаменяемы. Если они не одинакового размера (что становится все более распространенным, поскольку 64-разрядные процессоры и операционные системы становятся все более распространенными), % x
будет печатать только половину адреса. На Mac (и, возможно, в некоторых других системах) испортит адрес; вывод будет неправильным.
Всегда используйте % p
для указателей.
Размер указателя может отличаться от размера int
. Кроме того, при использовании % p
реализация может дать лучшее представление адреса, чем простое шестнадцатеричное значение.
x
- шестнадцатеричное целое без знака (32 бита).
p
- адрес указателя
См. printf в Справочнике по C ++ . Даже если бы они оба написали одно и то же, я бы использовал % p
для печати указателя.
x
используется для вывода аргумента указателя t в шестнадцатеричном формате.
Типичный адрес при печати с использованием % x
будет выглядеть как bfffc6e4
, а нормальный адрес, напечатанный с использованием % p
, будет 0xbfffc6e4
По крайней мере, на одной системе, что не так уж редко встречается, они печатаются по-разному:
~/src> uname -m
i686
~/src> gcc -v
Using built-in specs.
Target: i686-pc-linux-gnu
[some output snipped]
gcc version 4.1.2 (Gentoo 4.1.2)
~/src> gcc -o printfptr printfptr.c
~/src> ./printfptr
0xbf8ce99c
bf8ce99c
Обратите внимание, что версия указателя добавляет префикс 0x
, например. Всегда используйте %p, поскольку он знает о размере указателей и о том, как лучше представить их в виде текста.