'%p`在哪里对printf有用?

时间:2010-03-03 07:55:38

标签: c++ c printf

毕竟,这两个陈述都做同样的事情......

int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);

例如(使用不同的地址):

0012FEE0
0012FEE0

使用%x根据需要格式化指针是微不足道的,那么%p选项有一些很好用吗?

7 个答案:

答案 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)

x是无符号十六进制整数(32位)

p是指针地址

printf on the C++ Reference。即使两者都写相同,我也会使用%p来打印指针。

答案 5 :(得分:0)

当您需要调试时,使用带有%p选项的printf非常有用。当你有一个NULL值时,你会看到0x0。

答案 6 :(得分:-2)

x用于以十六进制打印t指针参数。

使用%x打印时的典型地址看起来像bfffc6e4,使用%p打印的合理地址为0xbfffc6e4