C(不是C ++)通过值/参考面试问题

时间:2011-05-18 21:13:55

标签: c calling-convention

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

“解释或对比C中传递值和传递参考”

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

这是一个问题:在C中真的有“通过引用传递”吗?

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

有什么根本不同的东西吗?
void f(int *xarg);
...
int x;
int *xp = &x;
f(xp);

VS

f(&x);

谢谢, 安德鲁

5 个答案:

答案 0 :(得分:11)

C中没有通过引用传递。

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

所以,你是对的。

答案 1 :(得分:5)

不 - C中没有通过引用传递 - 一切都是按值传递的。但是我觉得如果他们通过引用来解释传票,并且你因为这个原因而拒绝他们,那么对于受访者来说会有点困难,除非你正在寻找语言律师。

答案 2 :(得分:2)

C does not have pass-by-reference

为什么不把它称为“pass-by-pointer”呢?

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

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

从草案C99标准:

  

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

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

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