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