指针具有浮点值,确定输出

时间:2015-03-09 14:03:13

标签: c pointers

以下C程序的输出是什么?

#include <stdio.h> 

void abc (float, float, float *); 

 void main() { 
 float y = 2.5; 

 abc (6.5, y, &y); 
 printf ("%f\n",y); 
 } 

 void abc (float x, float y, float *z) { 
 y = y - 1; 
 *z = *z + x; 

 } 

a)1.5 b)2.5 c)8.0 d)9.0 e)9.5

答案是d)9.0。有人可以解释一下这是为什么吗?我认为这将是c)8.0因为在函数中我更新了y的值,因为y = y-1变为1.5。谢谢!

4 个答案:

答案 0 :(得分:2)

简短的回答是y中的mainy中的abc具有相同的名称,但它们是不同的。 abc中的那个只是一个副本。

首先,请注意函数abc的第一行是无用的,它会修改y,但之后不会使用y。因为当您调用函数时,会生成每个参数的副本,但这不会修改y中的main。现在y中的abc根本没有使用,所以我们可以从参数中删除它。

所以你可以这样重写abc

void abc (float x, float *z) { 
    *z = *z + x; 
} 

由于这样一个简单的单行函数没有多大意义,我们可以像这样重写你的程序:

void main() { 
    float y = 2.5;
    y = y + 6.5; 
    printf ("%f\n",y); 
} 

现在结果非常明显。

答案 1 :(得分:0)

简单,第三个参数是指向ymain()的指针。稍后将打印y值。

abc()内,float y是局部变量。对其值所做的任何更改都不会反映在调用者参数中。

OTOH,根据指针的逻辑,*z保留abc()内的计算值,从而将值反映回main()

简而言之,使用第三个参数abc()反映z内的计算值。

z ==&gt;的计算6.5 + 2.5 = 9.0

答案 2 :(得分:0)

 abc (6.5, y, &y); 

请注意,此处最后一个参数是按引用调用,并且您传递变量y的地址。

稍后在函数abc()中执行

*z = *z + x

*z = 2.5被称为取消引用指针,并且指针所指向的地址中存储的值为2.5和x=6.5,因为您将它传递给value.So

*z = 2.5 + 6.5 = 9.0

现在main()的值y=9.0,因为变量y的地址中存储的值已被函数调用abc()

修改

答案 3 :(得分:0)

在函数内部调用abc (6.5, y, &y)时,它将如下所示:

void abc (x = 6.5, y = 2.5, *z = 2.5) { 
 y = 2.5 - 1; // y = 1.5 
 *z = 2.5 + 6.5; // *z = 9.0
 } 

函数内的*z与函数外的y相同,因此y = 9.0