You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用%d与%p格式化指针会输出不同值?

为什么用%d和%p输出指针会得到不同结果?

首先直接给结论:你的猜测完全正确——用%d输出指针时,确实是把指针强制转换成了整数来输出,这也是两个结果存在差异的核心原因。

先拆解两个输出的本质差异

你看到的两个结果其实是同一个内存地址的不同表示形式:

  • 6356744 是地址的十进制整数形式
  • 0060FF08 是同一个地址的十六进制形式(%p默认以十六进制打印指针,并且会补前导零到系统指针的标准宽度,比如32位系统就是8位十六进制)

你可以自己验证一下:把十进制的6356744转换成十六进制,结果就是0x60FF08,和%p输出的0060FF08完全一致(只是多了前导零补位)。

具体是怎么把指针转成整数的?

这要从printf的可变参数特性说起:

  1. printf是可变参数函数,它不会主动检查你传入的参数类型和格式符是否匹配。当你传入指针a(类型是int*),却用%d(对应int类型)来解析时,它会直接把指针存储的二进制值当成int类型的二进制值来处理。
  2. 在32位系统中,int和指针的大小都是4字节,所以这个转换过程就是直接把指针的4字节二进制数据原封不动地解释成int,然后转换成十进制输出。比如你的例子里,指针a存储的地址是0x0060FF08,这个二进制值作为int计算的话,结果就是十进制的6356744。
  3. 要是在64位系统里,指针大小是8字节,而int通常是4字节,这时候用%d输出指针就会出现截断,得到错误的结果——这也是为什么这种用法是C标准里的未定义行为,绝对不要依赖它来输出指针。

额外提醒

输出指针的正确方式永远是用%p格式符,它会根据系统的指针大小和格式规范来正确打印地址,避免出现类型不匹配的问题。

内容的提问来源于stack exchange,提问作者thenoobcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:11:32