【问题标题】:Why do I need to specify references and pointers instead of plain variables in C为什么我需要在 C 中指定引用和指针而不是普通变量
【发布时间】:2019-04-05 01:10:39
【问题描述】:

如果所有引用和指针都简化为纯变量,究竟是什么阻止了编译器理解以下程序?

/* 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 做 这个 的事情?”

这里的任何直觉都会很有帮助 - 指向其他讨论的链接,例如“为什么使用指针”或“何时使用指针”不是我想要的。

【问题讨论】:

  • 这就是为什么 -> "/* 将三个数字作为输入并返回它们的总和和平均值作为输出 */ " 指针用于从函数返回 2 个值,而不仅仅是一个。 (顺便说一句,C 没有引用)。
  • 这似乎答案是“由于另一个不同的约束,C 必须遵守一个约束”。如果 C 需要查看 & 和星号才能从函数返回多个值,那么明显的问题是……为什么?具体来说,如果所有指针和引用都被删除,是什么阻止了编译器理解程序?
  • 如果您正在寻求关于 C 语言设计背后的推理的开放式讨论,那么这与 Stack Overflow 无关。
  • 不是编译器不理解它,而是它不会是同一个程序或做同样的事情。
  • C 通过“值”(而不是通过“引用”或“名称”等)传递所有函数参数。这意味着被调用的函数获得了它自己的参数的本地副本。它可以更改它们,但这些更改对于被调用函数来说是严格本地的。如果您希望更改对调用者可见,那么您需要传递指向目标变量的指针,以便被调用函数可以修改它们。

标签: c pointers reference ansi-c


【解决方案1】:

sum_n_avg() 接受 5 个输入:3 个是 double,2 个是指针。

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

除了指示数据存储位置的 2 个指针之外,没有任何信息来自函数。


如果所有引用和指针都简化为纯变量,究竟是什么阻止了编译器理解以下程序?

如果从sum_n_avg() 中删除“引用”,那么

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

是一个接受 5 个double 输入的函数。

没有来自函数的信息,也没有指示参数应该只是“输入”以外的任何东西。


为什么 C 做这件事

C 之所以成功,是因为设计简单。函数参数是输入。返回值为输出。

引用复杂的东西。

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

【讨论】:

  • 这很有道理,谢谢。我真诚地希望我理解正确。而不是分配内存位置并说“这些位置保存这些值”的函数,它需要解决已经存在的分配内存,然后说“这些内存位置在我做任何事情之前已经存在,现在保存这些值”。对吗?
  • @DavideLorino 关闭。对于sum_n_avg(one, two, three, &amp;sum, &amp;avg);sum_n_avg(double arg1, double arg2, double arg3, double *sum_, double *avg)sum_ 指向有效位置。 sum_n_avg() 可能会使用该指针来知道存储 sum 的位置。另一个函数可能只从那个位置读取,或者只是打印了指针,或者读写了这个位置,或者......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 2013-12-17
  • 1970-01-01
相关资源
最近更新 更多