【问题标题】:function parameter difference功能参数差异
【发布时间】:2020-05-27 10:52:17
【问题描述】:

这是两个相同的代码,但具有不同的函数参数,但它们似乎输出相同的东西。

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

    }

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

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

【问题讨论】:

  • 第一个函数返回 rate_mldrop 为调用者和第二个没有
  • @John Boi 说真的,没人知道 '*' 在你的函数中做了什么。:)

标签: c function pointers function-pointers


【解决方案1】:

据我所知,参数中带有'*'的变量是 输出参数。

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    还要注意你是否会为第一个函数头这样做:

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

    然后它就不再起作用了,而且通常将函数参数声明为 const 是一个很好的做法,以免意外覆盖它们,因为大多数时候你只是想阅读它们。

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 2011-11-05
      • 1970-01-01
      • 2016-03-16
      • 2016-10-14
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多