Почему мне нужно указывать ссылки и указатели вместо простых переменных в C - PullRequest
0 голосов
/ 05 апреля 2019

Что именно мешает компилятору понять следующую программу, если все ссылки и указатели были сведены к простым переменным?

/* Takes three numbers as input and returns their sum and average as output */

#include <stdio.h>

void sum_n_avg(double arg1, double arg2, double arg3, double 
*sum, double *avg);

int main(){
  double one, two, three, sum, avg;
  printf("Enter three numbers> ");
  scanf("%lf%lf%lf", &one, &two, &three);
  sum_n_avg(one, two, three, &sum, &avg);
  printf("%lf is the sum, %lf is the average\n", sum, avg);
}

void sum_n_avg(double arg1, double arg2, double arg3, double *sum, double *avg){
  *sum = arg1 + arg2 + arg3;
  *avg = (*sum) / 3;
}

Этот вопрос не "как мне это сделать", а скорее "почему C делает эту вещь?"

Любая интуиция здесь была бы очень полезна - ссылки на другие обсуждения, такие как «зачем использовать указатели» или «когда использовать указатели», не то, что я ищу.

1 Ответ

1 голос
/ 05 апреля 2019

sum_n_avg() принимает 5 входов: 3 - double, 2 - указатели.

void sum_n_avg(double arg1, double arg2, double arg3, double *sum, double *avg);

Нет никакой информации, выходящей из функции, кроме двух указателей, которые указывают, где хранить данные.


Что именно мешает компилятору понять следующую программу, если все ссылки и указатели были сведены к простым переменным?

Если удалить «ссылки» из sum_n_avg(), тогда

sum_n_avg_noref(double arg1, double arg2, double arg3, double  sum, double avg)

- это функция, которая принимает 5 double входов.

Нет никакой информации, выходящей из функции, ни указаний на то, что параметр должен быть чем-то, кроме «входа».


почему C делает это

C удалось из-за простой конструкции. Аргументы функции являются входными данными. Возвращаемым значением является выход.

Ссылки на сложные вещи.

Чтобы разместить более одного вывода, код передается в указателях как места для хранения данных.

...