Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.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+;+;)传递价值/参考访谈问题_C_Calling Convention - Fatal编程技术网

C(不是C+;+;)传递价值/参考访谈问题

C(不是C+;+;)传递价值/参考访谈问题,c,calling-convention,C,Calling Convention,我有一个问题列表,我想问一个候选人嵌入式系统编程的C技能。我的一个标准问题,也是很多公共问题列表中的一个问题,是这样的,但我开始认为这是一个糟糕的问题: “解释或对比C中的传递值和传递引用” 我告诉被采访者,这个问题与C++引用无关,我正在寻找一个解释:将指针传递给变量与变量,以及被叫者如何修改指针引用的变量。关于如何将指针传递到结构更有效的解释,需要额外的要点 这里有一个问题:C中真的有“通过引用传递”吗 被调用方的签名清楚地定义了所传递的内容。这并不是说你可以将x或&x传递给一个函数,然后让

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

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

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

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

被调用方的签名清楚地定义了所传递的内容。这并不是说你可以将x或&x传递给一个函数,然后让编译器知道该怎么做。所以我认为一切都是C,都是按值传递,而按引用传递实际上只是传递指针的值

有什么根本不同的吗

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

谢谢,
Andrew

C中没有通过引用

可以得到的最接近的指针是pass by pointer,它实际上是一个pass by值(只是复制的是指针,而不是指向的对象)

所以,你是对的


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

否-C中没有按引用传递-所有内容都是按值传递的。但我认为,如果受访者用指针解释“通过引用传递”,而你因此拒绝了他们,这对他们来说会有点困难,除非你正在寻找一位语言律师。

C总是通过值。您发布的代码片段之间实际上没有任何区别。事实上,无论哪种方式,优化编译器都可能发出相同的代码。

当然,C有“按引用传递”。。。这是一家公认的公司。Sci。广泛用于指从调用上下文提供对变量的访问的实践的术语。关键的是,它是通过引用传递的指向变量。通过值传递的指向它的指针正是C中可用的机制

任何优秀的C程序员都应该知道你原来的问题是什么意思,而不是像C++那样把它与“引用”混淆起来。 根据C99标准草案:

指针类型可以从函数类型、对象类型或不完整类型派生 类型,称为引用的类型。指针类型描述的对象的值 提供对所引用类型的实体的引用。从中派生的指针类型 引用的类型T有时称为“指向T的指针”。建筑 引用类型的指针类型称为“指针类型派生”

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


(元讨论——我认为有一位颇受尊敬的s.O.撰稿人对此持极端观点,其他人也加入了这一行列……当前“C”中的一致性缺乏通过引用”答案绝对不能代表行业公认的术语。这里没有指手画脚——我甚至没有试图找出谁先回答。就像在为比赛评判艺术、发表评论等方面一样——除非你在考虑其他人之前形成自己的观点,否则你无法公平、负责任地做这件事。也就是说,另一个问题是令人信服的解释是,问题本身的逻辑软化了所有人:-)

+1这个答案最能说明这一点,虽然OP关于C没有“通过引用”是正确的,但这是一个语言律师问题,可能不属于工作面试……对,对于指针传递与变量传递之间存在差异的任何解释,我都会给出完整的观点,例如使用swap函数,而不管确切的措辞如何。顺便说一句,我同样喜欢你和艾蒂安的答案,但不知道谁是第一名,这并不重要。@Andrew我以大约30秒的优势获得第一名。在那一点上,这几乎是一场竞赛。试着用语言中性的术语来表达这个问题:你将如何实现一个函数,它接收到一个X,然后对它执行Y?FlyWeight模式的优点是什么?你能用C语言描述一个实现吗?@sehe“FlyWeight模式”与语言无关??我认为自己精通C语言,我从未听说过。我可以蒙着眼睛回答最初的面试问题,虽然我目前不在找工作,但我不想在C类相关工作的面试中被问到你的语言中性问题。我表现出了创造性思维。此外,FlyWeight也是一种模式。它是语言中立的(很像NullObject和Memento这样的模式)@sehe我知道Flyweight模式是什么,我不认为它与这个问题相关。完全可以成为一个好的C或C++程序员而不必喝醉(或至少没有喝完)设计模式KooAID。尼尔:真的。我只是稍微扩展了一下想象力,以展示你如何要求对参数传递/值分配效率有相关的理解,而不提“通过引用传递”,或任何特定于语言的解释,因为面试问题给出了太多的答案。我在采访一位嵌入式系统开发人员时的目标是评估他们对细节的理解程度,因此我希望他们能提出“指针”。托尼,谢谢你的散文,他说得很好。我大体上同意,passbyreference是一个公认的术语,优秀的C程序员会理解它的含义。然而,我最近对嵌入式系统开发人员的采访经验表明,这个问题不是一个好问题。我想可能更好
f(&x);