%p的简单问题

码侬 2009-05-18 10:17:37
float a=3.14, b=1234567.000000; 
printf("a = %p, b = %f\n",a , b);

猜猜会输出什么?
然后运行一下试试。

%p到底是什么意思呢?
谁能给一个详解?

...全文
130 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
arong1234 2009-05-19
  • 打赏
  • 举报
回复
至少在vc中,%f和%lf没有差别,都使用double来处理的,因此都是8字节
[Quote=引用 8 楼 gao_zilai 的回复:]
谢谢3楼的,说的很详细。我做了如下实验证明了你的说法的前一段:

C/C++ codefloat a=3.14, b=1234567.000000;
float* d = &a;
printf("addr = %p, b = %f\n",d , b);


跟踪进去发现结果和你说的完全一致。

然后又做了如下实验证明了你的后半段:

C/C++ codeint a=3, b=1234567;
printf("a = %p, b = %d\n",a , b);


跟踪进去发现结果和你说的完全一致。

不过有一点不太理解的是:
“%f取走a的后四…
[/Quote]
wywgk 2009-05-19
  • 打赏
  • 举报
回复
标记下,有意义的一个议题
码侬 2009-05-19
  • 打赏
  • 举报
回复
谢谢3楼的,说的很详细。我做了如下实验证明了你的说法的前一段:
float a=3.14, b=1234567.000000; 
float* d = &a;
printf("addr = %p, b = %f\n",d , b);

跟踪进去发现结果和你说的完全一致。

然后又做了如下实验证明了你的后半段:
int a=3, b=1234567;
printf("a = %p, b = %d\n",a , b);

跟踪进去发现结果和你说的完全一致。

不过有一点不太理解的是:
“%f取走a的后四个字节+b的前四个字节”
%f是4个字节,为什么会取8个字节呢?还是%f本身就是8个字节?

另外,我是为了寻找答案,让大家猜测,我并没有猜测
herman~~ 2009-05-19
  • 打赏
  • 举报
回复
UP
Jalien 2009-05-19
  • 打赏
  • 举报
回复
学习~
cg05568256068 2009-05-19
  • 打赏
  • 举报
回复
顶三楼
fairchild811 2009-05-18
  • 打赏
  • 举报
回复
%p取走了a的前4个字节,%f取走a的后四个字节+b的前四个字节,
fairchild811 2009-05-18
  • 打赏
  • 举报
回复
输出指针的地址
liao05050075 2009-05-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 MichaelBomb 的回复:]
%p 就是以16进制输出指针内存储的地址。

还有你这个程序b已经超出单精度范围了。
[/Quote]

%p 就是以16进制输出指针内存储的地址。
使用起来有点像用printf("%x")来打印一个整型,它是直接把指针变量中的值打出来。
另外,b没有超过float
arong1234 2009-05-18
  • 打赏
  • 举报
回复
重要的不再与找到一个问题的答案,而是学会怎么去找答案。问题是无穷无尽的,你会了很多问题的答案也不会帮助你什么,只有你会根据问题自己找答案,才是成长了,所以永远不要“猜测”答案
arong1234 2009-05-18
  • 打赏
  • 举报
回复
不知道%p就猜测他会有什么结果不是一件很好的习惯,要学会根据问题找答案,而不是盲目的猜测答案
简单的说,%p是打印指针
首先要明白,不定参数列表的函数不会进行类型转换,他总是认为你传的是真实合法的类型,如果你打印的是指针,他认为你真的传一个指针给他,如果你传的不是指针,绝大多数情况就会错误
对于你这个特殊的例子:这个函数需要你先传一个指针,然后再传一个浮点数
而你传的是2个浮点数

你传进去8+8(不定参数再VC中一直把float转换成double传进去)共计16个字节,%p取走了a的前4个字节,%f取走a的后四个字节+b的前四个字节,因此整个结果完全不会和你想想的一致,具体结果需要非常复杂的计算,甚至你可以认为这是随机值
chenzhp 2009-05-18
  • 打赏
  • 举报
回复
address?
MichaelBomb 2009-05-18
  • 打赏
  • 举报
回复
%p 就是以16进制输出指针内存储的地址。

还有你这个程序b已经超出单精度范围了。

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧