指针值损失

时间:2012-08-17 04:56:03

标签: c++ pointers

嗨大家我有一个问题根值是每次我从插入函数出来时返回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;        
}

5 个答案:

答案 0 :(得分:2)

指针不会“失去”它的值。您需要将指向节点的指针传递给insert - 然后它可以通过参数“返回”指向节点的指针。

答案 1 :(得分:2)

您按值root传递,因此被调用者无法修改,您必须通过引用传递

void insert(node** _node,int val);
insert (&root,input);

答案 2 :(得分: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仍为零。

与指针没什么不同。如果要在函数中更改指针本身,则必须将其作为指针传递给它(并在函数中取消引用)或作为引用类型。

答案 3 :(得分: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),通话后kbar的值将变为42。

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

如果您来自Visual Basic,那么请记住C和C ++中的所有参数都是byval,除非另有说明(大多数其他现代语言也是如此)。

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

答案 4 :(得分:0)

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

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