毕竟,这两个陈述都做同样的事情......
int a = 10;
int *b = &a;
printf("%p\n",b);
printf("%08X\n",b);
Run Code Online (Sandbox Code Playgroud)
例如(具有不同的地址):
0012FEE0
0012FEE0
Run Code Online (Sandbox Code Playgroud)
根据需要格式化指针是微不足道的%x,那么是否有一些很好的%p选择?
Pet*_*sey 124
他们不做同样的事情.后一种printf语句将其解释b为一个unsigned int错误b的指针.
指针和unsigned ints的大小并不总是相同,因此这些不可互换.当它们的大小不同时(越来越常见的情况,因为64位CPU和操作系统变得越来越普遍),%x只会打印一半的地址.在Mac(可能还有其他一些系统)上,这将破坏地址; 输出将是错误的.
总是%p用于指针.
至少在一个不常见的系统上,它们不会打印相同的:
~/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
Run Code Online (Sandbox Code Playgroud)
请注意指针版本如何添加0x前缀.始终使用%p,因为它知道指针的大小,以及如何最好地将它们表示为文本.