Do指针参数需要通过引用传递
Do Pointer Parameters Need To Be Passed By Reference
我有一个非常简单的链表。如果我通过引用传递列表,我的addNode(Node* &list, int value)
函数只会向链表添加一个新节点。如果我按值传递列表,则不会:addNode(Node* list, int value)
。
我知道pass by value
和pass by reference
是什么,但我认为指针函数参数本质上是通过引用传递的,因为指针指向内存位置(是对实例的引用)。所以我觉得&
是多余的,不是吗?还是我错了?
class Node
{
public:
Node* next;
Node* prev;
int value;
Node(int nValue=0) : next(NULL), prev(NULL), value(nValue) { }
~Node() { cout << "Deleting " << value << endl; }
};
// Why do I need to pass by reference 'list'?
// If I dont then the variable 'linkedList' (in main) doesn't have nodes added to it
void addNode(Node* &list, int value)
{
Node* newNode = new Node(value);
newNode->prev = list;
list->next = newNode;
list = newNode;
}
int main()
{
Node* linkedList = new Node(1);
addNode(linkedList, 2);
// TODO: release memory
system("PAUSE");
return 0;
}
这取决于情况。在您更改函数内部指针的情况下,是的,您应该通过引用传递指针。另一方面,如果您不更改函数内部的指针,那么就没有理由添加另一个间接级别和引用传递。
不,指针不是通过引用自动传递的,它们和其他参数一样是通过值传递的。如果不通过引用传递,指针将被复制,并且只对副本进行操作,而不对原始指针进行操作。
此处的引用是必要的,因为您正试图更改指针以及指向对象。
如果通过指针传递Node
,调用方将看到对指针对象的任何更改,但不会看到对指针的更改,因为在调用函数时会生成指针的副本。如果通过指针引用传递Node
,则调用者将看到对这两个值的更改。
您的语句"指针函数参数固有地通过引用传递"并不完全正确。你需要考虑的是,当你传递一个指向函数的指针,而指针指向某个东西时,你实际上传递了两件事:
- 指针
- 尖头
因此,如果指针是按值传递的,则您有:
- 通过值传递的指针
- 通过引用传递的指针对象
在这种情况下,您可以在函数中修改指针对象,但不能修改指针。
如果指针是通过引用传递的,则您有:
- 通过引用传递的指针
- 通过引用传递的指针对象
在这种情况下,您可以同时修改指针和指针对象。
相关文章:
- C++取消引用指针.为什么会发生变化
- 深层复制具有自引用指针的类
- Visual c ++,使用字符串引用/指针调用 dll 函数
- std::unordered_map::提取引用/指针失效
- 为什么在引用指针时将 const 放在 & 符号的左侧有效,而在右侧则无效?
- 区分接受常量参数的函数引用/指针和与函数参数同名的非常量参数
- 如何在 c++ 中使用带有数学运算的引用/指针?
- 了解通过引用传递取消引用指针时C++堆/堆栈分配
- 取消引用指针并立即为其分配变量,导致分段错误
- 如何获取指向类(而不是对象)的引用/指针
- 将类型参数传递给自引用指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 在析构函数内取消引用指针时出现分段错误
- 来自引用指针的内存泄漏
- 引用指针后面的值
- 无法取消引用指针
- 引用指针调用成员函数
- 未定义的引用指针的变量模板在clang中功能,而不是GCC
- 取消引用指针以创建数组的副本
- 有关启动引用指针的引用的问题