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

毕竟,这两个陈述都是一样的。

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位的CPU和操作系统变得越来越普遍), %x只会打印一半的地址。 在Mac(也可能是其他一些系统)上,这毁掉地址; 输出将是错误的。

始终使用%p作为指针。

至less在一个并不罕见的系统上,它们不会打印出相同的结果:

 ~/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,因为它知道指针的大小,以及如何最好地将它们表示为文本。

你不能依靠%p显示一个0x前缀。 在Visual C ++上,它不。 使用%#p是可移植的。

指针的大小可能与int的大小不同。 当你使用%p时,一个实现可以产生比地址更简单的hex值表示。

x是无符号的hex整数(32位)

p是指针地址

请参阅C ++参考中的printf 。 即使他们两个都写同样的东西,我也会用%p打印一个指针。

当你需要debugging的时候,使用printf和%p选项是非常有帮助的。 当你有一个NULL值时你看到0x0。

x用于以hex打印t指针参数。

使用%x打印时的典型地址看起来像是bfffc6e4 ,而使用%p打印的正常地址将是0xbfffc6e4