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

不要再被什么“%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位。

 

 

  • 46
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值