разность параметров функции - PullRequest
0 голосов
/ 12 февраля 2020

Вот два одинаковых кода, но с разными параметрами функции, но они, похоже, выводят одни и те же вещи.

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 ]

1 голос
/ 12 февраля 2020

Из того, что я узнал, эти переменные с '*' в параметрах являются выходными параметрами.

Вы правильно указали, что такие параметры являются выходными параметрами.

Таким образом, в первой функции все три параметра являются выходными параметрами.

Во второй функции есть только один выходной параметр. Таким образом, вызывающая функция не может получить значения rate_ml и drop, введенные пользователем в функцию.

Поэтому, если вызывающая функция должна получить все три значения, ему следует использовать первое объявление функции. Если ему нужно только значение вычисления результата, он должен использовать второе объявление функции.

0 голосов
/ 12 февраля 2020

Параметры функции также являются локальными переменными для функции, так что вы можете использовать их так, как показано в первом примере. Например, int *drop может быть перезаписано в функции, как это происходит в вашем примере, и поэтому нет объявления типа int rate_ml, drop;, так как он использует 2-й и 3-й параметр в качестве локальных переменных.

Но это не нормальное использование их. Обычный вариант использования - это возможность давать значения функции в качестве аргументов для работы. Ваша первая функция игнорирует эти входящие значения и перезаписывает их с результатом scanf, используя их в основном как локальные переменные. Вот почему функция по существу ведет себя так же. Но это не так, как его следует использовать. Вторая форма более понятна, логична и ожидаема.

Также обратите внимание, что если вы сделаете это для первого заголовка функции:

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

Тогда она больше не будет работать, и это также Обычно рекомендуется объявлять аргументы функции как const, чтобы случайно не перезаписать их, потому что большую часть времени вы просто хотите их прочитать.

...