%p 打印地址?它打印的是变量值!什么是格式化输出,指针与地址的区别

您所在的位置:网站首页 printf指针输出 %p 打印地址?它打印的是变量值!什么是格式化输出,指针与地址的区别

%p 打印地址?它打印的是变量值!什么是格式化输出,指针与地址的区别

2023-08-15 16:51| 来源: 网络整理| 查看: 265

不要再被什么“%p 打印变量地址”、“%p 格式化地址” 误导了!

不要把指针神秘化、复杂化,它就是一个有点特殊的变量而已!

 

首先说指针与地址的区别:

指针是一个变量,这个变量占用一个存储空间,内部存储了一个值,只不过这个值比较特殊,它表示另一个变量的地址;

我们忽略这个值的特殊性,就可以发现,指针变量和其他变量并没有什么区别,都是一个变量,存储了一个值,如此而已!

 

而地址,只是存储空间的编号,并不存储在哪个存储空间里。

 

然后我们看%p,很多地方说%p打印的是变量的地址,这句话本意可能没错,但极易被误解为 printf("%p\n", a); 打印的是变量a的地址,这就错了!

我们写代码验证一下:

#include 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位。

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3