2

組み込みシステム プログラミングの C スキル候補を調査するために、私が聞きたい質問のリストがあります。私が持っている標準的な質問の 1 つで、多くの公開質問リストにも載っていますが、これは悪い質問だと思い始めています。

「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には「参照渡し」があります...それは十分に確立されたCompです。科学。呼び出しコンテキストから変数へのアクセスを提供する慣行を指すために広く使用されている用語です。重要なのは、参照によって渡されるのは、ポイント先の変数です。値渡しされるポインタへのポインタは、C で利用できるメカニズムにすぎません。

優れた C プログラマーは、元の質問の意味を正確に理解している必要があり、C++ などの「参照」と混同しないようにする必要があります。

ドラフト C99 標準から:

ポインター型は、関数型、オブジェクト型、または参照型と呼ばれる不完全な型から派生する場合があります。ポインタ型は、参照される型のエンティティへの参照を提供する値を持つオブジェクトを記述します。参照される型 T から派生したポインター型は、「T へのポインター」と呼ばれることがあります。参照された型からのポインター型の構築は、「ポインター型の派生」と呼ばれます。

(とは言っても、ポインターが値として渡されるという洞察は、言語が機能する実践的な方法を理解する上で重要な部分であり、それ自体が価値があります。)

(メタディスカッション - 尊敬されている SO 貢献者が 1 人いて、これについて極端な見方をしており、他の人が時流に乗っていると思います...現在の「C には参照渡しがありません」という回答の適合性は、間違いなく代表的なものではありません業界で受け入れられている用語. そこに指を向けることはありません. 誰が最初に回答したかを調べようとさえしませんでした. コンペティションのためのアートの審査や公開された批評など.他の人を考慮する前に意見. そうは言っても、別のもっともらしい説明は、質問自体の論理が全員を和らげたということです:-) )

于 2011-05-19T04:53:28.873 に答える