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