2016-07-22 4 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 []» является указателем, оно действительно изменено вашей функцией.

Если бы это было bool или int, то копия или аргумент были бы изменены в функции, но не самим аргументом, и, таким образом, вы не увидели бы эффекта вне вашей функции.

+2

Указатель не изменяется. Точка (ы), на которую указывает указатель, меняются. – NathanOliver

+0

Могу ли я сказать, что в случае массивов ссылка передается по значению? –

Смежные вопросы