为什么我的节点在我设置后被设置为 nullptr = 新节点?
Why is my node set as a nullptr after I have set it = new Node?
我已经将节点指针初始化为 nullptr,并将其作为引用传递给帮助程序函数。在辅助函数中,我将以前为 nullptr 的指针设置为等于新指针。但是,函数结束后,它会再次设置为 nullptr。
void helper(vector<int>& nums, int start, int end, TreeNode* root){
if(start >= end) return;
root = new TreeNode;
int median = (start + end) / 2;
root -> val = nums[median];
helper(nums, start, median - 1, root -> left);
helper(nums, median + 1, end, root -> right);
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
TreeNode* root = nullptr;
helper(nums, 0, nums.size() - 1, root);
return root;
}
将其
作为引用传递到帮助程序函数中
不,指针由值本身传递。参数root
只是参数的副本,函数内对指针本身的任何修改都与参数无关。
将其更改为按引用传递:
void helper(vector<int>& nums, int start, int end, TreeNode*& root){
// ^
if(start >= end) return;
root = new TreeNode;
int median = (start + end) / 2;
root -> val = nums[median];
helper(nums, start, median - 1, root -> left);
helper(nums, median + 1, end, root -> right);
}
参数按C++中的值传递。当你有
void foo(sometype x) {
x = something; // modifies the local x
}
然后,x
的修改将仅在函数内部可见,因为它是在函数本地x
上进行的。指针也不例外。如果要修改原始参数,则需要通过引用传递:
void bar(sometype& x) {
x = something; // modifies the object refered to by x
}
TL;您需要的灾难恢复
void helper(vector<int>& nums, int start, int end, TreeNode*& root){
....
PS:我想你的困惑源于这样一个事实,即指针允许您修改点。指针的副本指向同一对象,因此...
void moo(int* x) {
*x = 42; // modifies the int pointed to by x
}
int a = 0;
int* p = &a;
moo(p); // x above is a copy of p
不过,在一般情况下,应该首选引用(除非nullptr
是一个有效的参数(。此外,您要修改指针而不是脚尖。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 反向给定链表中的K节点
- 在C++/Linux中设置单调时钟的一些技巧
- 为什么我的节点在我设置后被设置为 nullptr = 新节点?
- OMNET++:如何在INET4.0中手动设置节点位置
- UWP:在树节点中将文本设置为粗体
- 在 Omnet++ 中的模拟时间内更改/设置节点的新位置
- 如何在NS3中设置节点的IP地址和数据?
- 节点.js C++插件 - 设置数组的某个索引
- 为什么将指针指向std ::设置的提取节点是未定义的行为
- 在C++中设置节点的内存地址
- 程序设置二叉树,打印和搜索 - 节点类C++
- 只是尝试插入一个节点并将指针设置为下一个节点C++
- BST设置每个指向节点的高度
- 为什么将场景管理器设置为场景节点的父级会在Irrlicht中引发错误
- 为所有openvdb::Grid节点设置/取消设置活动状态
- 是否有任何方法可以使用c++ libgraph为子图设置默认节点属性?
- 如何创建一个带有指向父节点的指针的节点类,该父节点可以设置为空
- 当我试图在远程Linux节点上更改Eclipse中的设置时,X服务器崩溃了
- 树表达式-节点设置