C语言:以下程序的输出结果是怎么出来的?

来源:百度知道 编辑:UC知道 时间:2024/07/07 06:12:41
以下程序的输出结果是

A)11.10 B)12.00 C)21.10 D)1.10

void fun(float *p1,float *p2,float *s)

{ s=(float *)calloc(1,sizeof(float) );

*s=*p1+*p2++;

}

main()

{ float a[2]={1.1,2.2},b[2]={10.0,20.0},*s=a;

fun(a,b,s);

printf("%5.2f\n",*s);

}
答案选的是A,但一直没弄明白怎么出来的,各位高手帮忙解释下,谢了
重要说明:答案选的是D,我选的是A,错了!!!!!!!!!!!!!!!!!!

正确答案不是A,应该是D,(可以运行试试),解释如下:
fun函数调用时,把数组a的首元素地址赋给p1,把数组b的首元素地址赋给p2,把指针s的值赋给形参s;
s=(float *)calloc(1,sizeof(float) );//为指针s开辟新的空间
*s=*p1+*p2++;//p1所指元素的值加上p2所指元素的值,把和赋给s所指变量,然后把p2所指的元素加1;因为上面为指针s新开辟了空间,从而s指向的元素不是主函数中s指向的元素,所以主函数中s指向的元素并没有变化,也就是a[0]的值不变;函数没有返回值。
主函数中的s仍然指向a的首元素,a[0]的值为1.1,故输出结果是1.10

也就是说影响这道题的关键是s=(float *)calloc(1,sizeof(float) );这一行,
如果没有这一行,答案将是A

fun函数就是计算a+b然后把结果赋值给s,a是取首地址指向的数1.1,b取首地址指向的数10.0,结果就是11.10。*p2++是*p2先参与运算,才再加1。