2016-04-14 10 views
1

私はマイナーなミスを無視してください、ライブラリのを含む他の正式な(コンパイルのため、このコードではありません)(ツリーを実装する)は、このようなコードの一部この関数を参照によって呼び出す必要があるのはなぜですか?

struct Node 
{ 
    int val; 
    struct node* left,*right; 
    Node(int x){ 
    val=x; 
    left=right=NULL; 
    } 
}; 

void insert(Node* &h,int val){ 
    if(h==NULL){ 
    h=new Node(val); 
    return; 
    } 
    if(h->val > val){ 
    insert(h->left,val); 
    } 
    else { 
    insert(h->right,val); 
    } 
} 

void temp(Node* h,int val){  // Node* h doesn't seem to work but 
            // Node*& h does!!! 
    insert(h,val); 
} 

int main() { 

struct Node* R=NULL; 
for(int i=0;i<5;i++){ 
    cin>>x; 
    temp(R,x); 
} 
    return 0; 
} 

を持っています。

私の質問はです: - 記載されている行の参照によってアドレスが渡される必要があるのはなぜですか?

私のポイント:永久になぜしないことによって、それを変更された関数を挿入するためのリファレンスを私は一時機能にメインからのルートのアドレスを送信していますし、その後一時機能は、でinsert関数にそのアドレスを送信していますルートのアドレスはここで変わる?そして、実際にここでどのアドレスが変更されているのかは間違いですか?

+0

にコンパイラによって作成された一時変数を渡しています。それ以外の場合はできません。 –

+0

は 'traverse'は' temp'とされています –

+0

@ M.Mそれは残念です。編集されました! – Dofenshmirtz

答えて

0

それ以外の場合、パラメータは値渡しになるためです。したがって、メインのR、またはツリーのルートノードであるものは、temp()/insert()が返された後も完全に変更されません。

最初にNULLだった場合は、temp()が返っても、それでもなおNULLになります。ルートノードとして新しいノードが挿入されたとします。起こったのは、実際のルートノードではなく、メモリのリークであったパラメータの値コピーが更新されたことだけでした。

+0

しかし、挿入機能で参照パラメータを渡すのはどうですか?私はそこを参照して渡っています。それはどう変わっていますか? – Dofenshmirtz

+0

これは、temp()の 'h'値を変更しています。それはそれが参考になるものです。 main()の値はtemp()に渡され、temp()のhパラメータはinsert()への参照によって渡されるため、insert()はtemp()を変更します。のパラメータ。ビッグディール。 –

+0

あなたは私のヒーロー<3 – Dofenshmirtz

0

このプログラムは、temp関数がポインタへの参照としてhを取っているため、セグメンテーション違反が発生します。

一時機能のシグニチャをvoid temp(Node* &h, int val)に変更すると動作します。

挿入機能は、時間にメモリを割り当てが、一時機能は、「参照渡し」機能は、元の値を変更することができることを意味し、内部挿入機能

関連する問題