2011-05-18 79 views
2

我有一個問題列表,我想問一下探究嵌入式系統編程的候選C語言技能。我有一個標準問題,這也是很多公開問題列表中的一個,但我開始認爲這是一個糟糕的問題:C(不是C++)通過價值/參考面試問題

「解釋或對比傳遞值和傳遞 - 在C參考「

我告訴受訪者,這個問題與C++引用無關,我正在尋找一個傳遞指向變量與變量的指針的解釋,以及被調用者如何修改引用的變量由指針。有關如何將指針傳遞給結構更有效的解釋的額外要點。

下面是問題:C中是否真的有「通過引用傳遞」?

被調用者的簽名明確定義了傳遞的內容。這並不是說你可以將x或& x傳遞給一個函數,並讓編譯器找出該做什麼。所以我會爭辯說,一切都是C傳遞值,傳遞引用實際上只是傳遞一個指針的值。

有一些關於

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

與根本不同

f(&x); 

感謝, 安德魯

+0

嘗試用語言中立的術語來表達這個問題:你將如何去實現一個接受X的函數並且做Y到它? FlyWeight模式的優點是什麼,你可以在C中描繪一個實現嗎? – sehe 2011-05-18 21:21:55

+3

@sehe「FlyWeight模式」是否是語言中立?我認爲自己在C語言流利,我從來沒有聽說過它。我可以回答被矇住眼睛的原始面試問題,雖然我目前沒有找工作,但我不願意被問及你的語言中立性問題,接受C相關工作的面試。 – 2011-05-18 21:33:55

+0

我表現出創造性思維。另外,FlyWeight是一種模式。它是語言中立的(很像NullObject和Memento之類的模式) – sehe 2011-05-18 21:37:35

回答

11

沒有通過引用傳遞在C.

最接近你可以得到的是通過指針,這實際上是一個通過值(除了它是被複制的指針,而不是指向的對象)。

所以,你是對的。

2

C does not have pass-by-reference

爲什麼不把它稱爲「傳遞指針」呢?

+0

對於一個面試問題,它給出了太多的答案。我在面試嵌入式系統開發人員時的目標是衡量他們對細節的理解程度,因此我正在尋找他們提出「指針」。 – 2011-05-18 23:16:38

1

C總是按價值傳遞。您發佈的代碼片段之間確實沒有任何區別。實際上,優化編譯器可能會以任何方式發出相同的代碼。

1

當然C有「通過參考」...這是一個完善的比較。科學。這個術語廣泛用於指從調用上下文中提供對變量的訪問的實踐。關鍵是,它是指向變量,通過引用傳遞。指向正在傳遞的指針的指針就是C的機制。

任何優秀的C程序員都應該確切地知道您的原始問題是什麼,而不是將它與「引用」混淆在一起C++等。

從C99標準草案:

指針類型可以從函數類型,對象類型,或不完整的 類型中導出,稱爲引用類型。指針類型描述對象,其值 向參考類型的實體提供參考。從 派生的指針類型有時被稱爲'指向T'的指針。從引用類型構造一個 指針類型被稱爲''指針類型派生''。

(這就是說,你的洞察力指針作爲值傳遞的是理解動手的方式語言工作的重要組成部分,並在自己的權利是有價值的。)

(元討論 - 我相信有一位備受尊敬的SO貢獻者對此持有極端的看法,而其他人正在跳上潮流......目前「C缺乏傳遞參考」答案的符合性絕對不代表行業接受的術語沒有指責 - 我甚至沒有試圖找出誰首先回應,就像在評判競爭藝術,發表評論等時一樣 - 除非你在考慮他人之前形成自己的觀點,否則你不能公平而負責任地做到這一點。也就是說,另一個合理的解釋是,問題中的邏輯本身使每個人都變得軟弱:-))

+0

託尼,感謝散文,很好地說。我基本上同意傳遞引用是一個完善的術語,好的C程序員會理解它的含義。但是,我最近對嵌入式系統開發人員的訪談經歷表明,這個問題不是很好。我認爲最好讓候選人實現交換功能,並確保他們知道基本的指針語法和語義。 – 2011-05-19 15:44:28

+0

@Andrew:有趣 - 我當然看不出有什麼缺陷要求對這些概念有明確的理解......這絕對是底線。乾杯。 – 2011-05-19 17:41:54