2016-07-22 176 views
0

我是新來的C++,根據我的理解,我一直在想,如果我在像fun(vector<int>&v)這樣的函數調用中傳遞向量的地址,那麼值不會被複制到int的新向量中,並且所做的任何更改都會反映回來,並且如果fun(vector<int> v)值被複制。在C++中傳遞參考

但是,當閱讀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可見,不使用「&」,這是類似於Java即會發生什麼引用是否被複制?我在哪裏理解它出錯了?

+13

數組不是矢量。他們的行爲有所不同。你正在比較蘋果和橘子。 – NathanOliver

+5

要添加到@NathanOliver語句:您無法按值傳遞數組。完全一樣。你實際上將一個指針傳遞給第一個元素。 –

+0

謝謝!我意識到我正在比較陣列與載體。 –

回答

0

由於「bool visited []」是一個指針,它的確被你的函數改變了。

如果它是一個布爾或int例如,副本或參數將在函數中更改,但不是參數本身,因此您會看到沒有效果以外的函數。

+2

指針未更改。指針指向的東西被改變。 – NathanOliver

+0

我可以說,在數組的情況下,引用是通過值傳遞? –