2016-04-24 18 views
0

私は、以下の状況で私が見ていることについて概念的に混乱しています。ポインタはmain()からfunction(func1())に参照渡しされます。 func1()はさらに、このポインタを参照によってfunc2()に渡します。 func2()がポインタを更新して新しいアドレスを指すようになったら、これはmain()に反映されます。ポインタは参照渡しですか? (サニティチェック)

疑問:それはへのポインタへのポインタのポインタ、バックグラウンドでのいくつかの並べ替え

1.ですか?

2.)PTR1及びPTR2は、(メインで参照によって渡された場合* func1の中& PTR1と* & PTR2()がNULLに初期化され参照はありませんか?私は参照がNULLに初期化することはできませんを読んだ。

#include <iostream> 
using namespace std; 

void func2(int *&ptr2) 
{ 
    int var2 = 123; 
    ptr2 = &var2; 

    cout << endl <<"func2 - ptr2: " << ptr2 << endl; 
} 

void func1(int *&ptr1, int *&ptr2) 
{ 
    int var1 = 111; 
    ptr1 = &var1; 
    func2(ptr2); 

    cout << endl << "func1 - ptr1: " << ptr1 << " ptr2: " << ptr2 << endl; 
} 

int main() 
{ 
    int *ptr1 = NULL; 
    int *ptr2 = NULL; 
    cout << "main - ptr1: " << ptr1 << " ptr2: " << ptr2 << endl; 

    func1(ptr1, ptr2); 
    cout << "main now - ptr1: " << ptr1 << " ptr2: " << ptr2 << endl; 

    return 0; 
} 

OUTPUT:

main - ptr1: 0 ptr2: 0 

func2 - ptr2: 0x28fe3c 

func1 - ptr1: 0x28fe6c ptr2: 0x28fe3c 
main now - ptr1: 0x28fe6c ptr2: 0x28fe3c 
+2

これは参照の使用の全体点です。参照と関数を削除すると、変更は表示されません。事実、ref演算子は、追加のポインタを省略すると便利です。 – lipp

+2

参照は、参照しているオブジェクトの別の名前と同じです。エイリアスのように。 – Bateman

+0

そのコードの目的は何ですか? – perencia

答えて

3

いいえ、「へのポインタへのポインタのポインタ」バックグラウンドではありません?。

ただ1つのポインタがあります。

オブジェクトへの参照を渡すことは、本質的に、参照されるオブジェクトへのポインタを渡します。次に、その参照が2番目の参照として渡された場合、同じ実際の内部ポインタがそのまま渡されます。したがって、2番目の関数は最初の関数と同じ内部ポインタを受け取ります。

+0

これはすべての時間に適用されるのでしょうか?私は、一部のコンパイラが参照変数を最適化し、コンパイル時に参照変数に置き換えることがある場所を読んでいると思います。それが正しいかどうかは分かりません。 –

+0

これはすべての参照に適用されます。int a; int &b=a; int &c=b; 'b'と' c'の両方が同じ内部ポインタです。これは、オプションのコンパイラ最適化ではありません。これは、C++コードをコンパイルする唯一の方法です。 –

+0

OKだが、コンパイラがコード中で 'b'や' c'を見た時、内部ポインタ( '' b''と '' c'')を全く使わずに最適化して、 '' 「b」と「c」を「a」で置き換えます。それは本当ではないのですか?私はこれを読むと思う[ここ](http://stackoverflow.com/questions/2323189/how-is-a-reference-different-from-a-pointer-in-implementation) –

関連する問題