Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么我需要在C中指定引用和指针而不是普通变量_C_Pointers_Reference_Ansi C - Fatal编程技术网

为什么我需要在C中指定引用和指针而不是普通变量

为什么我需要在C中指定引用和指针而不是普通变量,c,pointers,reference,ansi-c,C,Pointers,Reference,Ansi C,如果所有引用和指针都简化为普通变量,那么到底是什么阻止编译器理解以下程序 /* 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

如果所有引用和指针都简化为普通变量,那么到底是什么阻止编译器理解以下程序

/* 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为什么做这件事

这里的任何直觉都会很有帮助——我不想看到其他讨论的链接,比如为什么使用指针或何时使用指针。

sum\u n\u avg需要5个输入:3个是双输入,2个是指针

void sum_n_avg(double arg1, double arg2, double arg3, double *sum, double *avg);
除了两个指示数据存储位置的指针外,函数中没有其他信息

如果所有引用和指针都简化为普通变量,那么到底是什么阻止编译器理解以下程序

/* 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;
}
如果从sum_n_avg中删除引用,则

是一个需要5个双输入的函数

函数中没有任何信息,也没有指示参数应仅为输入以外的任何内容

C为什么做这件事

C成功是因为一个简单的设计。函数参数是输入。返回值就是输出

涉及复杂的事情


为了容纳多个输出,代码将指针作为存储数据的位置传入。

这就是为什么->/*将三个数字作为输入,并将它们的总和和平均值作为输出返回*/指针用于从函数返回两个值,而不是仅返回一个值。顺便说一句,C没有引用。答案似乎是C必须遵守一个约束,因为另一个约束不同。如果C需要看到符号和星号才能从一个函数返回多个值,那么显而易见的问题是。。。为什么?具体地说,如果删除了所有指针和引用,是什么阻止编译器理解程序?如果您正在寻求一个关于C语言设计背后的推理的开放式讨论,那么这是堆栈溢出的话题。并不是编译器不理解它,这是因为它不会是同一个程序或做同一件事。C通过值传递所有函数参数,而不是通过引用或名称等。这意味着被调用的函数会获得自己的参数的本地副本。它可以更改它们,但是这些更改对于被调用的函数来说是严格的局部更改。如果您希望更改对调用方可见,那么您需要传递指向目标变量的指针,以便被调用函数可以修改它们。这非常有意义,谢谢。我真诚地希望我理解正确。与其说函数分配内存位置并说这些位置保存这些值,不如说它需要寻址已经存在的已分配内存,然后说这些在我做任何事情之前已经存在的内存位置,现在保存这些值。“是这样吗?”戴维德洛里诺说。和sum_n_avgone,2,3,&sum,&avg;和sum_n_avgdouble arg1、double arg2、double arg3、double*sum_、double*avg、sum_指向有效位置。sum_n_avg可能会使用该指针来知道在哪里存储sum。另一个函数可能只从该位置读取,或只是打印指针,或读取并写入该位置或。。。