输出指针代码

时间:2015-10-28 10:02:36

标签: c pointers

为什么输出以下C代码为0.000000?

#include <stdio.h>

void foo(float *);

int main()
{
    int i = 10, *p = &i;
    foo(&i);
}

void foo(float *p)
{
    printf("%f\n", *p);
}

请解释你的答案。

4 个答案:

答案 0 :(得分:4)

您正在使printf()解释整数的位,就像它们是浮点的位一样。这是undefined behavior

您期望得到什么结果?

答案 1 :(得分:1)

首先,当你的代码看起来像你的问题时,*p = &i;行根本没有做任何事情。

接下来 - 您将指向int变量的指针传递给期望float的函数。就像评论中提到的@unwind一样,foo()无法知道你撒了谎。 类型转换与您似乎认为的不同。

#include <stdio.h>
void foo(float *);
int main()
{
    int i = 10; //try this and see it fails, 
                //then switch this line with float i = 10; and try again
    foo(&i);
}
void foo(float *p)
{
    printf("%f\n", *p);
}

编辑&gt;如果你坚持在某个地方进行类型转换......

#include <stdio.h>
void foo(float *);
int main()
{
    int i = 10;
    float p = (float)i;
    foo(&p);
    return 0;
}
void foo(float *p)
{
    printf("%f\n", *p);
}

答案 2 :(得分:0)

C和C ++中的

Variadic functions使用可变数量的参数,而他们不知道条目参数的类型。

printf函数中,第一个参数是一个字符串,希望通过格式说明符指示以下参数的类型。

在您的代码中,您的说明符指示以下参数是float(Answer),但您已传递整数。由于所有这种类型检查都是在运行时进行的,并且编译器对此一无所知,因此没有自动转换。

您的代码调用未定义的行为。

答案 3 :(得分:0)

试试这个:

#include <stdio.h>
void foo(int *);
int main()
{
    int i = 10;
    foo(&i);
}
void foo(int *p)
{
    printf("%f\n",(float) *p);
}