【发布时间】:2013-04-03 15:01:51
【问题描述】:
我试图运行这段代码,
int *p;
float q;
q = 6.6;
p = &q;
虽然这将是一个警告,但我认为&q 和p 的大小相同,所以p 的地址可以是q。但是当我打印&q 和p 时,我得到了不同的输出。
这是我的输出
*p = 6.600000
q = 0.000000, p = 0x40d33333, &q = 0x7fffe2fa3c8c
我错过了什么?
当指针和变量类型相同时,p 和 &q 相同。
我的完整代码是
#include<stdio.h>
void main()
{
int *p;
float q;
q = 6.6;
p = &q;
printf("*p = %f \n q = %f, p = %p, &q = %p \n",*p,q,p,&q);
}
【问题讨论】:
-
请显示您用于获取该输出的代码。
-
这是
int main(void),而不是void main()。void main()主要用于检测不太了解 C 的作者所写的书籍。 -
您在 x86_64 上运行?那么
printf("*p = %f \n q = %f, p = %p, &q = %p \n",*p,q,p,&q);中可能发生的事情是推定的int*p在通用寄存器中传递,double(q的提升值)在浮点寄存器中传递,两个指针再次在通用寄存器中。 -
然后
printf读取第一个浮点寄存器进行第一次%f转换,第二个浮点寄存器进行第二次%f[正好包含0],第一个通用寄存器-包含float6.6 的位 - 打印p,第二个通用寄存器(包含p的值)打印&q。包含q地址的寄存器仍未读取。 -
@RohitO:如果你知道
int main(void)应该一直被使用,那么我建议你一直使用它;至少,它会避免像我这样的人的抱怨。至于为什么int*和float*是不同的类型,我只是在我的答案中添加了几段。