2011-12-07 7 views
1

私は最後に仕事をした人が書いたCコードをいくつか維持しています。参照渡しに関する状況が発生しました。ここで私が働いているかの短縮、不自然な例です:私はこの二つを考えるCでの参照渡しの微妙さ

*a = b; 

OR

a = &b; 

:SetToTen機能で

static int b; 

void SetToTen(int *a){ 
    b = 10; 
    /* >>>>>>> Need to set a equal to b on this line <<<<<<<< */ 
return; 
} 

int main{ 
    int a = 0; 
    SetToTen(&a); 
    /* Now a should be equal to 10*/ 
    . 
    . 
    . 
return 0; 
} 

、私はどちらかでし書き込み機能的には同等です(どちらも10であることになります)。しかし私の質問は、互いに関連した卑劣な微妙な点があるかどうかです。具体的には、もし私が= & bを使用すると、私が将来bを変えると、aも変わるでしょうか?そして、私が* a = bを使うと、これは当てはまりませんか?

思考/ Musings /コメントは高く評価されます。

答えて

5

これらは機能的に同等ではありません。このコードは、

*a = b; 

を参照し、その値をbの値に設定します。このコード:

a = &b; 

Bを指すようにポインタを変更します。 2番目のコードを使用すると、ポインタを値で変更しているため、何も起こりません。実際にはは変更されません。

2
*a = b; 

これは正しいものです。

a = &b; 

これは単なるアドレスに値をコピーしたことです。 C言語はすべて引数を値で渡します。 (C++には参照の概念があります)関数に渡される引数を変更する場合は、アドレスまたは配列を渡して、アドレスまたは配列のメンバーが参照する値を変更する必要があります。

宣言し、次のように関数を定義する方がよい場合があります。あなたからこれらの変更を

void setToTen(int *pa){ 
    *pa = 10; 
} 

を:

    として aを使用する混乱を回避 pa(ポインタ-TO-A)
  1. あなたの主な関数の値と、SetToTen()のポインタとしてのa
  2. アドレスがtで渡される変数を設定することが目的なら、どこでもbを使う本当の理由はありませんo 10.
  3. スタイル/構文:ほとんどのCコーディング規則では、変数/メソッドとして小文字で始まるシンボルを使用し、型として大文字で始まるシンボルを使用します。
  4. スタイル/構文:明示的なreturnのステートメントは、値を返そうとしていない(関数がvoid宣言されている)か、関数の終了前に途中で返りたい場合を除き、必要ありません。

類推:ミスター・スミスの青で115メインストリート、で、そして緑で205エルムセントでジョーンズ氏、2軒の家があります。あなたはスミス氏の住所を含む紙切れを持っています。

*a = b;は、ジョーンズ氏の家と同じ色の紙の上の住所に家を描くようなものです。

a = &b;紙の伝票の住所をMr. Jonesの住所に変更するようなものです。それは実際には何の結果ももたらさない。

+1

+1誰も私の後で次のように繰り返します:「Cで参照渡しはありません。 –

+0

先生、StackOverflowについてあなたの好きなことを見ました。私はちょうどあなたの意見を聞いてあなたと質問を共有したいので、その質問は多くのdownvotesに値する。 https://stackoverflow.com/questions/34826036/explain-pointer-referencing。私はここに新しいですが、今この質問が下落されたので私は何の質問もすることはできませんが、私は何の理由も見ません。確認してください。私はあなたのポストを愛し、あなたが私を助けてくれると思ったので、私はあなたに尋ねました。 –

+0

正直言って、質問はあまりよく書かれておらず、「私はCの初心者です」と言った後に自分で答えたので、このサイトの評判ポイントを得るために投稿したように見えます。私はunderscore_dのコメントをエコーし​​ます。「このサイトには多くの質問と回答があり、エイリアシングやポインタの変換などについてのより広いインターネットがあります。あなたの場合、私はあなたが明確かつ簡潔な質問または答えを投稿することを学ぶことに取り組む必要があると思います。評判のために質問を投稿できない場合は、司会者に連絡して修正できるかどうかを確認してください。 –