2016-07-22 10 views
0

Ich bin neu in C++, von meinem Verständnis habe ich gedacht, wenn ich die Adresse eines Vektors in einem Funktionsaufruf wie fun(vector<int>&v) übergeben, dann werden die Werte nicht in einen neuen Vektor von int und kopiert Alle vorgenommenen Änderungen werden zurückreflektiert, und wenn im Fall von fun(vector<int> v) Werte kopiert werden.Referenz in C++

Aber beim Lesen this link from geeksfrogeeks erkannte ich, dass selbst wenn '&' nicht da ist die Änderungen auf dem Vektor in der Funktion gemacht wird, nachdem es endet.

hier ist der Code:

/* This function prints all nodes that are distance k from a leaf node 
    path[] --> Store ancestors of a node 
    visited[] --> Stores true if a node is printed as output. A node may be k 
       distance away from many leaves, we want to print it once */ 
void kDistantFromLeafUtil(Node* node, int path[], bool visited[], 
          int pathLen, int k) 
{ 
    // Base case 
    if (node==NULL) return; 

    /* append this Node to the path array */ 
    path[pathLen] = node->key; 
    visited[pathLen] = false; 
    pathLen++; 

    /* it's a leaf, so print the ancestor at distance k only 
     if the ancestor is not already printed */ 
    if (node->left == NULL && node->right == NULL && 
     pathLen-k-1 >= 0 && visited[pathLen-k-1] == false) 
    { 
     cout << path[pathLen-k-1] << " "; 
     visited[pathLen-k-1] = true; 
     return; 
    } 

    /* If not leaf node, recur for left and right subtrees */ 
    kDistantFromLeafUtil(node->left, path, visited, pathLen, k); 
    kDistantFromLeafUtil(node->right, path, visited, pathLen, k); 
} 

Die Änderungen in dem besuchten Array durch eine Funktion sind auf den zweiten Aufruf KDistanceFromLeafUtil sichtbar gemacht, ohne ‚&‘ zu verwenden, ist dies ähnlich dem, was in Java geschieht dh referenziert wird kopiert? Wo bin ich falsch gelaufen, um es zu verstehen?

+13

Ein Array ist kein Vektor. Sie verhalten sich anders. Sie vergleichen Äpfel mit Orangen. – NathanOliver

+5

So fügen Sie der @NathanOliver-Anweisung hinzu: Sie können Arrays nicht nach Wert übergeben. Überhaupt. Sie übergeben tatsächlich einen Zeiger auf das erste Element. –

+0

Danke !! Ich erkannte, dass ich Arrays mit Vektoren vergleiche. –

Antwort

0

Da "bool besucht []" ein Zeiger ist, wird es tatsächlich von Ihrer Funktion geändert.

Wenn es zum Beispiel ein bool oder ein int wäre, wäre die Kopie oder das Argument in der Funktion geändert worden, aber nicht das Argument selbst, und somit hätten Sie keinen Effekt außerhalb Ihrer Funktion gesehen.

+2

Der Zeiger wird nicht geändert. Die Sache (n), auf die der Zeiger zeigt, werden geändert. – NathanOliver

+0

Kann ich sagen, dass im Falle von Arrays die Referenz als Wert übergeben wird? –