我如何传递指针参数有什么问题吗?

时间:2019-06-18 22:56:34

标签: c function pointers

问题不是什么大问题,但是我不确定我是否缺乏了解给我的具体评论的知识。

这是我必须使用指针的一部分。

我从我的老师那里收到了关于使用指针的函数returnfunc的一段代码的评论。

注释如下:“函数具有什么输入/输出?唯一要输入的就是判断点!”

我会要求进一步的清理,但接下来的1-2天该教练不可用。

所以我没有等我,而是希望有人可以看看,也许能确定是什么意思?

代码中突出显示的部分如下所示:

//function declaration
void returnfunc(float *low, float *average, float *high,  float array[],int judges);

//calling function in the main function
returnfunc(&low, &average, &high, pointArray,judges);


//code for returnfunc function
void returnfunc(float *low, float *average, float *high, float pointArray[],int judges){

    float small =pointArray[0];
    float large =pointArray[0];
    float total;

    for(int i =0;i<judges;i++){
        if(small>pointArray[i]){
            small = pointArray[i];
        }
        if(large<pointArray[i]){
            large = pointArray[i];
        }
    }


    for(int i = 0;i<judges;i++){
        total += pointArray[i];
    }

    *average = (total-(large+small))/(judges-2); //average without largest and smallest value
    *high=large;
    *low=small;

}

judges是用户选择的判断量。

pointArray是一个数组,其中包含每个法官给出的点。

我对代码的解释是,输入是lowhighaverage的地址,也是pointArrayjudges的地址。

输出将是averagehighlow的更新变量

您会说这是正确的吗?

2 个答案:

答案 0 :(得分:3)

是的。我的猜测是,您的讲师希望您具有三种独立的功能,一种可以找到最低的分数,一种可以找到最高的分数,另一种可以找到没有最低和最高分数的平均值。这将允许每个函数直接返回单个结果。

void returnfunc(float *low, float *average, float *high, float pointArray[],int judges)
{
    float small =pointArray[0];
    float large =pointArray[0];
    float total;

    for(int i =0;i<judges;i++){
        if(small>pointArray[i]){
            small = pointArray[i];
        }
        if(large<pointArray[i]){
            large = pointArray[i];
        }
    }


    for(int i = 0;i<judges;i++){
        total += pointArray[i];
    }

    *average = (total-(large+small))/(judges-2); //average without largest and smallest value
    *high=large;
    *low=small;
}

一个nitpick:为什么可以在单个循环中完成所有操作,为什么要在两个pointArray循环中对for进行两次迭代?

又一个“ nitpick”:虽然small>pointArray[i]pointArray[i] < small的含义相同,但我认为后者可以更好地传达代码的意图。

还有一个错误:开始添加内容之前,请不要将total设置为零。您也可以在开始时将total设置为pointArray[0],然后从1开始循环。

答案 1 :(得分:0)

构造函数显然表示不清楚该函数的输入和输出是什么。可以通过以下方式对此进行改进:

  • 一个普遍的约定是,在函数声明中,首先列出输入参数,然后列出输出参数。在您的示例中,顺序相反。
  • 使用指针作为参数时,它们既可以是指针(或数组)类型的输入参数,也可以是输出参数。由于C语法无法明确区分这种情况,因此另一个好的做法是在函数声明上方添加注释,以解释所有参数的作用和目的。

大卫·史瓦兹(David Schwarz)答复说,他认为您的教练可能期望有多种功能:一种用于平均水平,一种用于低水平,另一种用于高水平。从性能的角度看,这似乎并不吸引人,因为这意味着所有这些函数都必须在点数组上进行迭代,而一个函数可以在一次迭代中完成。正如其他人已经指出的那样:通过将两个for循环合并为一个,可以改善您的功能。