2011-10-26 6 views
1

Node *&aNodeとは何ですか?次のコードで

void insert(Node *& aNode, int x) { 
    if (!aNode) { 
    aNode = new Node(x); 
    aNode->next = aNode; 
    return; 
    } 

    Node *p = aNode; 
    Node *prev = NULL; 
    do { 
    prev = p; 
    p = p->next; 
    if (x <= p->data && x >= prev->data) break; // For case 1) 
    if ((prev->data > p->data) && (x < p->data || x > prev->data)) break; // For case 2) 
    } while (p != aNode); // when back to starting point, then stop. For case 3) 

    Node *newNode = new Node(x); 
    newNode->next = p; 
    prev->next = newNode; 
} 

ノード* &アノードは何ですか?

どのようにこの関数を使用する必要がありますか?つまり、どのタイプのパラメータを渡す必要がありますか?

+3

私はそれが有効であるとは思わないCあなたはC++としてretagする必要があります。 –

+0

@ denniston.tありがとう。 Yeas –

+1

循環ソートリスト?それも可能ですか? – Dani

答えて

10

私は、このコードは、C++ Cではないと思うし、あなたが関数にNode*を渡すと、関数はそのへの参照(そのメモリ位置、あなたになるだろうのでNode *&aNodeは、Nodeへのポインタへの参照ですNode*は変更可能です)。

あなたはthe Wikipedia article on References (C++)が面白いかもしれません。

簡単な例:

#include <iostream> 
void addOneToValue(int num) { 
    ++num; 
} 

void addOneToRef(int &num) { 
    ++num; 
} 

int main() { 
    int num = 0; 

    // print 0 
    std::cout << num << std::endl; 

    // print 0 again (addOneToValue() has no effect) 
    addOneToValue(num); 
    std::cout << num << std::endl; 

    // print 1 (addOneToRef() changes the value of num) 
    addOneToRef(num); 
    std::cout << num << std::endl; 
} 

crashmstrさんのコメント@は、私は、彼らがポインタと異なるならどのように言う必要があることを思い出しました。 Wikipedia does a better job that I could though

  • 参照オブジェクトが定義された後は直接参照することはできません。その名前の出現は、それが参照するオブジェクトを直接参照します。
  • 参照が作成されると、後で別のオブジェクトを参照することはできません。再設置することはできません。これはしばしばポインタで行われます。
  • ポインタはできるのに対し、参照はnullにできません。すべての参照はあるオブジェクトを参照しますが、有効であっても有効でなくてもかまいません。
  • 参照を初期化できません。参照を再初期化することは不可能であるため、参照が作成されるとすぐに初期化する必要があります。特に、ローカルおよびグローバル変数は、定義されている場所で初期化されなければならず、クラスインスタンスのデータメンバーである参照は、クラスのコンストラクタの初期化子リストで初期化されなければなりません。
  • ほとんどのコンパイラは、何らかの方法でリファレンスを使用しようとするとクラッシュすることなく、多くの苦情なしにヌルリファレンスをサポートします。
+2

Cでは、 'Node ** aNode'(ポインタへのポインタ)が必要で、コード全体に*と&が広がります。ポインタへの参照は、C++でエラーが起こりにくい可能性があります。 – crashmstr

+0

ありがとうございます。 @ crashmstr –

+0

ありがとう@ブレンダン長い、明確な説明。 –

関連する問題