不要再被什么“%p 打印变量地址”、“%p 格式化地址” 误导了!
不要把指针神秘化、复杂化,它就是一个有点特殊的变量而已!
首先说指针与地址的区别:
指针是一个变量,这个变量占用一个存储空间,内部存储了一个值,只不过这个值比较特殊,它表示另一个变量的地址;
我们忽略这个值的特殊性,就可以发现,指针变量和其他变量并没有什么区别,都是一个变量,存储了一个值,如此而已!
而地址,只是存储空间的编号,并不存储在哪个存储空间里。
然后我们看%p,很多地方说%p打印的是变量的地址,这句话本意可能没错,但极易被误解为 printf("%p\n", a); 打印的是变量a的地址,这就错了!
我们写代码验证一下:
#include <stdio.h>
int
main(){
int a = 34;
printf("%p\n", a);
return 0;
}
编译运行可以看到结果为:
0x22是什么,可不就是变量a的值34嘛,说好的地址呢?
所以说,%p对变量进行的格式化是将变量值以16进制打印,并在前面添加0x
不是所谓的打印变量地址!
而 printf 只是格式化输出,是把某个变量的值进行格式化(写成某种形式),然后输出,并不存在获取变量地址的功能。
所以要打印变量a的地址,
要么定义个指针(如 p)指向a,用 printf("%p\n", p);打印
要么用 指针运算符& 先 算出变量a的地址 再打印:printf("%p\n", &a);
所谓定义指针也就是用运算符&算出a的地址再赋给指针变量p而已(int *p = &a;)
最后说下 %p 和 %x 的区别,
在32位机中,两者只差一个前面的0x,%p 有,%x 没有;
在64位机中,%p 可以打印64位(理论上是64位,实际上目前是48位),%x 只能打印32位;
在打印指针变量的值(所指变量的地址)时,%p 能正确打印,%x 则只能打印后32位。