2017-04-30 20 views
0

私はC++に新たなんだと私は(&)正確にどのようにポインタ(*)と参照を学ぶために仕事をしようとしています。次のコードで"FOO(int型*&ポインタ)" 対 "のfoo(int型*ポインタ)"

#include <iostream> 
using namespace std; 


void test1(int* pointer) 
{ 
    int foo = 2; 
    pointer = &foo; 
} 

void test2(int* &pointer) 
{ 
    int foo = 3; 
    pointer = &foo; 
} 

int main() 
{ 
    int aux = 1; 
    int* p = &aux; 

    test1(p); 
    cout << *p << ","; 
    test2(p); 
    cout << *p << endl; 

    system("PAUSE"); 
} 

1,3

を出力なぜtest1Pが指したがtest1ないされたメモリの場所を変更するために管理していますか?

test1Pを変えていないので、その後、test1にやっラインpointer = &foo;は何ですか?

+1

'test1'と' test2'の両方にバグがあります。スコープの外にある関数ローカル変数のアドレスを取っているので、ダングリングポインタが残っています – CoryKramer

+4

@CoryKramer:実際は 'test1'それはローカル変数へのポインタを返さないので、ダングリングポインタを作成しません。 – rodrigo

+0

@CoryKramer 'int * pointer'を新しく作成したオブジェクトに変更する正しい方法は何でしょうか? – Chapi

答えて

2

C++には、void foo(int i)のように、値渡しの2つの一般的な方法があり、参照渡しはvoid foo(int &i)のように2つあります。値渡しは、渡された値のコピーを作成しますが、参照渡しは渡された値への参照をバインドします。このように、値渡しを使用する関数は元の値を変更できませんなぜなら関数はコピーしか持たないのに対し、参照渡しは参照を通じて元の値を変更する方法を提供するからです。

test1の場合、ポインタ型の値を値渡しすることです。あなたがtest1(p)を呼び出すときに、あなたがこれをしなかったかのように、それはです:このよう

int *pointer = p; int foo = 2; pointer = &foo;

pは変更されません。

test2の場合、pに変更をもたらす参照によってポインタ型の値を渡しています。 、あなたは一般的にfooのようなローカル変数のアドレスを取得し、機能外の何かにそれを割り当てたくない

int *&pointer = p; int foo = 3; pointer = &foo;

注:あなたが実際に次のように書くことができ、それは同じ効果を持っているでしょうあなたがしているようにtest2test2(p)を呼び出した結果、pは存在しなくなったオブジェクトを指しているので、pから読み取ると「未定義の動作」が発生します。基本的に、コンピュータはfooを格納するために使用されていたメモリを再利用している可能性があります。 test2の実行であり、pから読み取ろうとすると、非常に奇妙な値が得られる可能性があります。

関連する問題