毕竟,这两个陈述都做同样的事情......
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
例如(使用不同的地址):
0012FEE0
0012FEE0
使用%x
根据需要格式化指针是微不足道的,那么%p
选项有一些很好用吗?
答案 0 :(得分:120)
他们不做同样的事情。后者printf
语句将b
解释为unsigned int
,这是错误的,因为b
是指针。
指针和unsigned int
的大小并不总是相同,因此这些不可互换。当它们的大小不同时(越来越常见的情况,因为64位CPU和操作系统变得越来越普遍),%x
只会打印一半的地址。在Mac(可能还有其他一些系统)上,将破坏地址;输出将是错误的。
始终使用%p
作为指针。
答案 1 :(得分:8)
至少在一个不常见的系统上,它们不会打印相同的内容:
~/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,因为它知道指针的大小,以及如何最好地将它们表示为文本。
答案 2 :(得分:5)
您不能依赖%p
显示0x
前缀。在Visual C ++上,它没有。使用%#p
可以移植。
答案 3 :(得分:4)
指针的大小可能与int
的大小不同。当您使用%p
时,实现也可以比地址的简单十六进制值表示更好。
答案 4 :(得分:2)
答案 5 :(得分:0)
当您需要调试时,使用带有%p
选项的printf非常有用。当你有一个NULL值时,你会看到0x0。
答案 6 :(得分:-2)
x
用于以十六进制打印t指针参数。
使用%x
打印时的典型地址看起来像bfffc6e4
,使用%p
打印的合理地址为0xbfffc6e4