2

我有一个问题列表,我想问这些问题来探讨候选人的嵌入式系统编程 C 技能。我的标准问题之一,也在很多公共问题列表中,但我开始认为这是一个糟糕的问题:

“解释或对比 C 中的按值传递和按引用传递”

我告诉受访者,这个问题与 C++ 引用无关,我正在寻找关于将指针传递给变量与变量以及被调用者如何修改指针引用的变量的解释。关于如何将指针传递给结构更有效的解释的额外要点。

问题来了:C 中真的有“通过引用传递”吗?

被调用者的签名清楚地定义了传递的内容。这不像您可以将 x 或 &x 传递给函数并让编译器弄清楚要做什么。所以我认为一切都是 C 是按值传递的,而按引用传递实际上只是传递指针的值。

有什么根本不同的东西吗

void f(int *xarg);
...
int x;
int *xp = &x;
f(xp);

对比

f(&x);

谢谢,安德鲁

4

5 回答 5

11

C中没有引用传递。

您可以获得的最接近的是指针传递,这实际上是值传递(除了它是复制的指针,而不是指向的对象)。

所以,你是对的。

于 2011-05-18T21:16:30.597 回答
5

不 - C 中没有引用传递 - 一切都是按值传递的。但是我认为,如果他们解释通过引用通过指针,而您因此拒绝了他们,那么对于受访者来说会有点困难,除非您正在寻找语言律师。

于 2011-05-18T21:17:08.637 回答
2

C没有 pass-by-reference

为什么不将其称为“按指针传递”呢?

于 2011-05-18T21:17:03.380 回答
1

C 总是按值传递。您发布的代码片段之间确实没有任何区别。事实上,优化编译器可能会以任何一种方式发出相同的代码。

于 2011-05-18T21:19:05.393 回答
1

当然 C 有“通过引用”......这是一个成熟的比较。科学。广泛用于指代从调用上下文提供对变量的访问的实践的术语。至关重要的是,它是通过引用传递的指向变量。按值传递的指向它的指针只是 C 中可用的机制。

任何优秀的 C 程序员都应该确切地知道您的原始问题是什么意思,而不是按照 C++ 等将其与“引用”混淆。

来自 C99 标准草案:

指针类型可以派生自函数类型、对象类型或不完整类型,称为引用类型。指针类型描述了一个对象,其值提供对被引用类型实体的引用。从引用类型 T 派生的指针类型有时称为“指向 T 的指针”。从引用类型构造指针类型称为“指针类型派生”。

(也就是说,您对指针作为值传递的见解是理解语言工作方式的重要组成部分,并且本身就很有价值。)

(元讨论——我宁愿认为有一个受人尊敬的 SO 贡献者对此持极端看法,而其他人则在赶潮流......当前“C 缺乏参考传递”答案中的一致性绝对不具有代表性行业接受的术语。没有指责那里 - 我什至没有试图找出谁首先回应。就像在比赛中评判艺术,发表的评论等 - 你不能公平和负责任地做到这一点,除非你形成自己的在考虑其他人之前发表意见。也就是说,另一个合理的解释是问题本身的逻辑让每个人都软化了:-))

于 2011-05-19T04:53:28.873 回答