关于#c语言#的问题,请各位专家解答!


#include <stdio.h>
#include <stdlib.h>
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);
}

求输出结果。
参考答案是1.10,但是不太看得懂指针这块的代码,希望可以帮忙解释一下过程。

  • s指针传入函数,都是值传递,不影响主函数的s指针,所以它还是指向数组a的第一个元素
  • 代码有些问题,如下才能正确编译:
#include<stdio.h>
#include <stdlib.h>
void fun(float * p1,float * p2,float * s){
    s=(float * )malloc(sizeof(float));
    *s=*p1 + *p2++;
}
int 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);
    return 0;
}

代码贴对了吗?第5行的i变量从哪来的呢?fun函数怎么前两个参数都是p1?

该回答引用GPTᴼᴾᴱᴺᴬᴵ
这段C语言代码的功能是定义了一个函数fun,该函数接受三个指向浮点型变量的指针p1、p2和s,其中p1和p2是输入参数,s是输出参数。函数功能是将p1和p2指向的浮点数相加,并将结果存储在动态分配的内存中,并将该内存地址赋值给指针s指向的内存单元。
·
在主函数main中,定义了两个浮点型数组a和b,分别初始化为{1.1, 2.2}和{10.0, 20.0},以及一个指向a数组的指针s。然后调用函数fun,将a、b和s的地址传递给函数fun,执行函数fun后,指针s指向的内存单元的值被更新为1.10,最后输出1.10。
·
但是,该程序存在一个问题,即在函数fun中使用calloc函数为指针s动态分配内存,并将p1和p2指向的值相加后存储到该内存中,但是由于s是函数fun的形参,s指向的地址与main函数中定义的指针s指向的地址不同,因此函数执行完毕后,main函数中的指针s并没有被更新。所以程序的输出结果应该是未定义的。为了正确使用该函数,应该将函数fun的第三个参数改为指向指针的指针,即将函数原型改为void fun(float *p1, float p2, float **s),并在函数中通过s来更新指针s指向的内存单元的值。