2011-07-14 28 views
0

誰かがリファレンスと参照外オペレータを理解できますか?ここで参照演算子と参照解除演算子について理解していますか?

である私が読んだ/これまでの理解:

int myNum = 30; 
    int a = &myNum; // a equals the address where myNum is storing 30, 
    int *a = &myNum; // *a equals the value of myNum. 

私は混乱していた下のコードを見たとき:

void myFunc(int &c) // Don't understand this. shouldn't this be int *c? 
    { 
     c += 10; 
     cout<< c; 
    } 

    int main() 
    { 
     int myNum = 30; 
     myFunc(myNum); 
     cout<< myNum ;   
    } 

int &cは右に渡されているものへのアドレスを持っていますか?

私がc+=10を実行したとき、それはメモリアドレスに10を加え、値30ではなく10を追加します。正しいですか?

しかし...私はこれを実行します...もちろん、すべての正しいインクルードとstuff ...それは動作します。それは40を印刷します。

答えて

0

int &cを使用して参照によって物事を渡すときに参照を取り消す必要はありません。あなたはポインタを逆参照する必要があります。それがint *cだったらそれは必要である。どちらの場合も、元の呼び出し元で渡された値を変更してmyNumが40になるようにしてください。

+0

この理解は正しいですか? ... –

+0

あなたの言っていることは:void myFunc(int * c)を使ったmyFunc(&myNum)です。 myFunc(myNum)とvoid myFunc(int&c)と同じですか?あなたのお手伝いをありがとう。 :) –

+0

アドレスのサイズがsizeof(unsigned long)またはvoid *タイプ –

1

myFuncの関数パラメータリストのアンパサンドは、アドレス演算子でも、ビット演算子でも演算子でもありません。これは参照インジケータです。つまり、myFuncの中で、パラメータcは、それに渡される引数のエイリアスになります。

+0

だから、cはaの別名です。だからc = a。しかし、なぜそこに&を置くのですか?もし私が&私は同じc = aを取得します。これは正しいです?私は&が何のためにこの場合に欠けている。ご協力いただきありがとうございます。 :) –

+0

エイリアスとは、複数の名前がメモリ内の同じものを正確に参照することを意味します。だから 'myFunc(myNum)'を呼び出すと 'myFunc'が' myFunc(int&c) 'として宣言され、' myFunc'の中で 'c'に何をしても' c'は 'myNum'になります。あなたが渡したものの別の名前です。アンパサンドは、C++のデザイナーが選んだ単なる表記です。エイリアシングは、同じ値を持つ2つの異なるオブジェクト(これは単に平等と呼ばれます)とはまったく異なります。エイリアシングにはオブジェクトが1つしかありません!ちょうど2つの名前があります。 –

+0

私はそれを得ていると思うので... myFunc(int&c)は私の* aと同じmem addyです。 void myFunc(int * c)のmyFunc(&myNum)もvoid myFunc(int&c)のmyFunc(myNum)と同じですか? –

1

ここにはいくつか問題があります。

  1. コードint a = &myNum; // a equals the address where myNum is storing 30の2行目が間違っています。
    のように3行目と組み合わせることができます。

  2. タイプint &は、 "reference-to-int"として読み込まれます。おそらくWikipedia articleは、これが何を意味するのかを理解するのに役立ちます。

+0

助けてくれてありがとう。私は私のiPhoneにいるので、私はテストすることはできません謝罪します。だからあなたのポイント#1について....私は<< *私はmyNumのアドレスを取得し、値ではありませんか? –

+0

いいえ、 'a'は' myNum'のアドレスになります。式 '* a'は" dereference 'a'"を意味しているので、 'cout << * a'はアドレスの値、すなわち' myNum'を出力します。 – Richard

1

両方のコードが有効であり、コードの最初の部分のポインタの理解が正しいです。ただし、2つのコードのアンパサンド(&)は実際には異なるものです。 (同様に、逆参照と乗算の両方の演算子のように)

2番目のコードは、&を使用して関数に変数を渡す方法を示しています。あなたはこのようなコードを持っていた。通常ならば:

int a; 

void foo(int bar) { 
    bar = 3; 
} 

int main() { 
    a = 5; 
    foo(a); 
    // a still equals 5 
} 

への呼び出し「fooが()」あなたは(barまたはこの場合、aに)渡された変数には影響を与えません。あなたはこの行変更された場合しかし:

void foo(int &bar) { 

void foo(int bar) { 

を、それが変数に影響を与えると、上記のプログラムの終了時に、aの値は3になります。

+0

私は理解しています...したがって、void foo(intとbar)はvoid foo(int * bar)と同じですか? * barでbar = 3を取得できますか?私は私の電話の上にいるので、私はテストすることができないことを謝罪します。 :) –

+0

それは似ています。 'void foo(int&bar){bar = 3; } 'void foo(int * bar){* bar = 3;}と同じことをします。 } '基本的に、&barを使うと、逆参照を気にする必要はありません。 – quasiverse

+0

Brilliant !!!!本当にありがとうございます...あなたはちょうどあなた自身を新しい友達にしました! :)私はC++の先生の紹介よりも100倍はっきりと説明しました。 –

0

はのは、最初の仮定を見てみましょう:コードについて

int myNum = 30; 

// this won't compile. &myNum is the address of an int (an int *), not an int: 
int a = &myNum; 

// *a is a pointer to an int. It received the address of myNum (which is &myNum), 
// and not its value 
int *a = &myNum; 

void myFunc(int &c) 
// c is passed by reference. This is a kind of "hidden pointer" that 
// allows using the variable as if it was not a pointer but the pointed variable. 
// But as this reference and the variable that was passed by the caller (myNum 
// in your example) share the same address (this is the property of a reference), 
// any modification of the value of c inside myFunc modifies it in the 
// caller's scope too (so here, it modifies myNum). 
{ 
    c += 10; 
    cout<< c; 
} 

int main() 
{ 
    int myNum = 30; 
    myFunc(myNum); // displays 40 

    // What follows displays 40 as well, due to the fact 
    // c was passed by reference to myFunc that added 10 to it  
    cout<< myNum ; 
} 

私はC + = 10を行うときに、メモリアドレスに10を追加するために起こっていると ではありません。正しいですか?

いいえ、cの値には、myFuncという値が10に加算されました。 cmyNumを受け取った参照( "hidden pointer to")であるため、myNumも変更されています。

関連する問題