单选题 以下程序的输出结果是______。
#include <stdio.h>
void fun(float*a, float*b)
{ float w;
*a=*a+*a;
w=*a;
*a=*b;
*b=w;
}
main()
{ float x=2.0, y=3.0;
float *px=&x, *py=&y;
fun(px, py);
printf("% 2.0f, % 2.0f/n", x, y);
}
  • A.4,3
  • B.2,3
  • C.3,4
  • D.3,2
【正确答案】 C
【答案解析】[解析] 主函数中定义了两个float变量x和y,以及基类型为float的指针变量px和py,并且把x和y的地址分别赋给了px和py。主函数中调用fun()函数时,把px和py作为实参,也就是把变量x和y的地址传送给形参。函数fun()为void类型,因此函数没有函数值返回。函数的形参a和b是两个基类型为float的指针变量。因此,在a和b中接受的是主函数中x和y的地址。在fun()函数体中,*a和*b将分别引用主函数中x和y的存储单元。fun()函数中,语句*a=*a+*a;的含义是两次取a所指对象(主函数的x)中的值相加,其和为4.0,赋给a所指对象(主函数的x)中,因此主函数的x中被重新赋值,x中的值变成4.0。fun()函数中后面的3条语句,是交换两个变量值的典型算法。先把a所指存储单元(主函数的x)中的值放在临时变量W中,然后把b所指存储单元(主函数的y)中的值放在a所指存储单元(主函数的x)中,最后把w中的值放入b所指存储单元(主函数的y)中。从而通过fun()函数,对主函数的x和y中的值进行交换。交换之前x中的值变成4.0,y中的值是3.0,经过交换,x中的值已变成3.0, y中的值为4.0。主函数的输出语句中,使用了“%2.0f”的格式说明,表明输出数据占两个字符位置,但“.0”的格式规定输出时不含小数点和小数,所以输出结果应是3,4。总结:本题给出了通过函数对两数进行交换的算法。注意:实参和形参之间仍遵循“按值传送”的规则,交换是通过指针间接进行的。