指针值损失

Pointer Value LOSS

本文关键字:损失 指针      更新时间:2023-10-16

我有一个问题,每次我从插入函数中出来时根值都会返回到 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);

此时,YZ都将发生变化,但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),调用后bark的值将变为 42。

如果您正在使用C++则&字符告诉编译器node参数应通过引用而不是值传递(即您不想复制指针,但该函数应直接与您的变量一起使用。

如果您来自Visual Basic,那么请记住,除非另有说明,否则所有参数都byval在C和C++中(在大多数其他现代语言中也会发生同样的情况)。

实际上,在 C 和大多数其他现代语言中,根本没有办法通过引用传递参数。

除了关于这里pointers to pointers的所有答案之外,我还想指出,您的insert函数正在分配永远不会被删除的内存。

您需要设计同时处理allocationsdeallocations的系统。