2016-07-22 13 views
0

私の理解から、私はfun(vector<int>&v)のような関数呼び出しでベクタのアドレスを渡す場合、値がintの新しいベクトルにコピーされていないことを考えている私は、Cの++に新しいですし、すべての変更は反映され、fun(vector<int> v)の場合は値がコピーされます。渡す参照

しかし、this link from geeksfrogeeksを読むと、「&」がなくても、関数内で作成されたベクトルの変更は終了後も保持されることに気付きました。ここ

コードです:、

/* 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); 
} 

一つの機能によってなさ訪れた配列の変化は、「&」を使用せずに、KDistanceFromLeafUtilへの2回目の呼び出しに表示され、これはJavaのIEで何が起こるかに似です参照はコピーされますか?私はどこでそれを理解するのが間違っていたのですか?

+13

配列は、ベクターはありません。彼らは異なった振る舞いをします。あなたはリンゴとオレンジを比較しています。 – NathanOliver

+5

は@NathanOliver書に追加するには:あなたは値によって配列を渡すことはできません。まったく。あなたは実際に最初の要素へのポインタを渡します。 –

+0

ありがとう!!私はベクトルと配列を比較していることに気付きました。 –

答えて

0

ポインタである「ブール[]が訪問した」として、それは確かにあなたの関数によって変更されます。

それはブール値またはインスタンスのためのint、コピーまたは引数が関数に変更はなく、引数自体、ひいてはあなたは、関数の外では効果が見られなかっただろうされていたであろう。だったら

+2

ポインタは変更されません。ポインタが指すものが変更されます。 – NathanOliver

+0

配列の場合、参照は値渡しと言うことができますか? –