在 C++ 中传递引用
Passing reference in C++
我是 c++ 的新手,根据我的理解,我一直在想,如果我在像 fun(vector<int>&v)
这样的函数调用中传递一个向量的地址,那么这些值就不会被复制到一个新的 int 向量中,并且所做的任何更改都会反映回来,如果 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 时,一个函数对访问数组所做的更改是可见的,这是否类似于 Java 中发生的情况,即引用被复制?我哪里理解错了?
因为“bool visited[]”是一个指针,它确实被你的函数改变了。
例如,如果它是 bool 或 int,副本或参数将在函数中更改,但参数本身不会更改,因此您将看不到函数外部的任何影响。
我是 c++ 的新手,根据我的理解,我一直在想,如果我在像 fun(vector<int>&v)
这样的函数调用中传递一个向量的地址,那么这些值就不会被复制到一个新的 int 向量中,并且所做的任何更改都会反映回来,如果 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 时,一个函数对访问数组所做的更改是可见的,这是否类似于 Java 中发生的情况,即引用被复制?我哪里理解错了?
因为“bool visited[]”是一个指针,它确实被你的函数改变了。
例如,如果它是 bool 或 int,副本或参数将在函数中更改,但参数本身不会更改,因此您将看不到函数外部的任何影响。