指针值损失
Pointer Value LOSS
我有一个问题,每次我从插入函数中出来时根值都会返回到 NULL,我真的无法真正理解为什么指针不保留它的值。
int main(int argc, char *argv[])
{
int input;
node* root = NULL;
while (input >0 ) {
cout<< "Enter a Number:";
cin>> input;
insert (root,input);
}
printall(root);
system("PAUSE");
return 0;
}
void insert(node* _node,int val)
{
//#if 0
cout << "In insert before" << _node;
if (_node == NULL) {
_node = new node;
_node->val = val;
_node->left = NULL;
_node->right = NULL;
return;
}
//#endif
if(_node->val > val) {
insert(_node->left,val);
} else if (_node->val < val) {
insert(_node->right,val);
}
return;
}
指针没有"丢失"它的值。你需要传递一个指向指向节点的指针到insert
- 然后它可以通过参数"返回"指向节点的指针。
您正在按值传递root
,因此被调用方无法修改它,您必须通过引用传递它
void insert(node** _node,int val);
insert (&root,input);
更改函数中的root
指针(或任何指针),则需要传递指向该指针的指针(如果您使用的是C++,则更可能是引用,我很确定您是,因为您使用的是new
)。像这样:
void fn (node **pRoot) {
*pRoot = new node;
}
C 和 C++ 都是默认的按值传递,因此更改不会回显到更高级别。
请考虑以下代码:
void changeVals (int x, int *py, int &z) {
x = 1;
*py = 2;
z = 3;
}
int X = 0;
int Y = 0;
int Z = 0;
changeVals (X, &Y, Z);
此时,Y
和Z
都将发生变化,但X
仍将为零。
指针也不例外。如果要更改函数中的指针本身,则必须将其作为指向它的指针(并在函数内取消引用)或作为引用类型传递。
简短回答:您正在使用C++,但忘记输入字符或键盘有缺陷...正确的代码是
void insert(node *& _node, int value) // note '&'
{
...
}
长答案:
通常 C 和 C++ 函数参数是"按值"的,这意味着被调用的函数将收到您传递给它们的副本......
void foo(int x)
{
x = 42;
}
void bar()
{
int k = 12;
foo(k);
// Here k is still 12, not 42
}
但是,C++具有"引用"的概念,允许您在不复制的情况下传递参数,然后该函数可以例如更改调用方变量。将foo(int x)
更改为foo(int& x)
,调用后bar
中k
的值将变为 42。
如果您正在使用C++则&
字符告诉编译器node
参数应通过引用而不是值传递(即您不想复制指针,但该函数应直接与您的变量一起使用。
如果您来自Visual Basic,那么请记住,除非另有说明,否则所有参数都byval
在C和C++中(在大多数其他现代语言中也会发生同样的情况)。
实际上,在 C 和大多数其他现代语言中,根本没有办法通过引用传递参数。
除了关于这里pointers to pointers
的所有答案之外,我还想指出,您的insert
函数正在分配永远不会被删除的内存。
您需要设计同时处理allocations
和deallocations
的系统。
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 正在将指针转换为范围
- 使用指向成员的指针将成员函数作为参数传递
- 指针值损失
- 指针向量与值向量 大内存块与小内存块的性能损失