功能参数差异

function parameter difference

这里有两段相同的代码,但函数参数不同,但输出的似乎是一样的。

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);

    }

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

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

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

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

另请注意您是否会对第一个函数头执行此操作:

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

然后它将不再起作用,这通常是将函数参数声明为 const 以防止意外覆盖它们的好习惯,因为大多数时候你只想阅读它们。

from what I learned, those variables with '*' in the parameters are output parameters.

您正确地指出此类参数是输出参数。

所以在第一个函数中所有三个参数都是输出参数。

第二个函数只有一个输出参数。所以函数的调用者无法获取用户在函数中输入的rate_mldrop的值。

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