功能参数差异

时间:2020-02-11 23:28:57

标签: c function pointers function-pointers

这是两个相同的代码,但是功能参数不同,但是它们似乎在输出相同的内容。

void get_rate_drop_factor(int *rate_ml, int *drop, int *drop_per_min)
{
    printf("Enter rate in ml/hr=> ");
    scanf("%d", rate_ml);
    printf("Enter tubin's drop factor(drop/ml)=> ");
    scanf("%d",drop);
    *drop_per_min = (*rate_ml / 60) * *drop;
    printf("The drop rate per minute is: %d\n\n", *drop_per_min);

}

据我了解,这些参数中带有“ *”的变量是输出参数。

void get_rate_drop_factor(int *drop_per_min)
    {
        int rate_ml, drop;
        printf("Enter rate in ml/hr=> ");
        scanf("%d", &rate_ml);
        printf("Enter tubin's drop factor(drop/ml)=> ");
        scanf("%d",&drop);
        *drop_per_min = (rate_ml / 60) * drop;
        printf("The drop rate per minute is: %d\n\n", *drop_per_min);

    }

当我调用该函数时,这两个代码似乎在输出相同的内容。那么'*'对参数的作用是什么? 我认为我不完全了解参数的概念。

请很好地解释,因为我真的很想学习这一点,这真令人沮丧。

2 个答案:

答案 0 :(得分:1)

据我了解,这些参数中带有“ *”的变量是 输出参数。

您正确指出这些参数是输出参数。

因此在第一个函数中,所有三个参数均为输出参数。

在第二个功能中,只有一个输出参数。因此,函数的调用者无法获取用户在函数中输入的rate_mldrop的值。

因此,如果函数的调用者需要获取所有三个值,则应使用第一个函数声明。如果他只需要结果计算的值,则应使用第二个函数声明。

答案 1 :(得分:0)

函数参数基本上也是函数的局部变量,因此您可以使用它们,例如第一个示例所示。例如,int *drop可能会在函数中被覆盖,这就是示例中发生的情况,这就是为什么没有像int rate_ml, drop;这样的声明的原因,因为它使用2nd和3rd参数作为局部变量。

但这不是它们的正常用法。正常的用例是能够为函数提供值作为要使用的参数。您的第一个函数将忽略这些传入值,并用scanf的结果覆盖它们,从而基本上将它们用作局部变量。这就是该函数本质上具有相同行为的原因。但这不是应使用的方式。第二种形式是更清晰,合乎逻辑和预期的。

还请注意是否要对第一个函数头执行此操作:

void get_rate_drop_factor(int *rate_ml, int const *drop, int const *drop_per_min)

然后它将不再起作用,这通常是一个好习惯,将函数参数声明为const不会意外覆盖它们,因为大多数时候您只想读取它们。

相关问题