指针值丢失

3
我有一个问题,每当我从插入函数中退出时,根值都会返回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;        
}

这是一个经典的指针问题。我遇到过很多次,所以我遵循一个简单的规则。需要改变变量的值吗?传递它的地址。这意味着需要改变指针的值吗?传递它的地址! - Abhinav
5个回答

2
指针的值并没有“丢失”。您需要传递一个指向节点的指针以插入 - 然后它可以通过参数“返回”一个节点指针。

2
您正在通过值传递root,因此被调用者无法修改它,您必须通过引用传递它。
void insert(node** _node,int val);
insert (&root,input);

1

如果你想在函数内改变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仍然为零。

指针也是如此。如果您想在函数中更改指针本身,则必须将其作为指向它的指针(并在函数内部取消引用)或作为引用类型传递。


1
简短回答:您正在使用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和大多数其他现代语言中,根本没有办法使参数按引用传递。


0
除了这里关于指向指针的所有答案之外,我想指出你的插入函数正在分配从未被删除的内存。
你需要设计处理分配和释放的系统。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接