C++ C++;指针故障

C++ C++;指针故障,c++,pointers,C++,Pointers,我有以下代码的问题。我是一个java开发者,试图自学C++。main()中的代码基本上没有向根节点插入任何内容。有人能帮我吗。我确信我的指针有问题 class Node{ public: Node* left; Node* right; int data; Node(int n){ data = n; right = NULL; left = NULL; } }; clas

我有以下代码的问题。我是一个java开发者,试图自学C++。main()中的代码基本上没有向根节点插入任何内容。有人能帮我吗。我确信我的指针有问题

class Node{
    public:
        Node* left;
        Node* right;
        int data;

    Node(int n){
        data = n;
        right = NULL;
        left = NULL;
    }
};

class BST{

    Node* root;

    public:

    BST(){
        root = NULL;
    }

    void insert(int e){
        pinsert(root, e);
    }

    void pinsert(Node* sr, int e){
        if(sr == NULL){
            sr = new Node(e);
        }
        else{
            if((sr->data) > e ){
                pinsert(sr->left, e);
            }
            else{
                pinsert(sr->right, e);
            }
        }
    }
};


int main(){
    BST tree;
    tree.insert(6);
    tree.insert(7);
}

您通过值传递
sr
,并分配给它。这不会改变您的
root
。请改为通过引用传递:

void pinsert( Node*& sr, int e)

问题是
root
始终为空,您从未向其分配任何内容

调用
pinsert(root,e)
然后执行以下操作时:

void pinsert(Node* sr, int e){
    if(sr == NULL){
        sr = new Node(e);
    }

您发送根目录的副本并分配给该副本,而不是保留为空的
根目录。您需要通过引用发送指针(
void pinsert(Node**sr,int e)
)-注意2个“星”或
void pinsert(Node*&sr,int e)

插入的问题是从空列表开始。当您将
节点*
传递给
pinsert
函数时,参数将按值传递,因此函数将以指针的副本结束。当指针为空时,可以将指针更改为指向新节点。由于在
pinsert
中只有指针的副本,因此这只会更改指针的副本。当函数返回时,指针和列表保持不变

传递对指针的引用以绕过此问题:

void pinsert(Node *&sr, int e)
现在,代码的其余部分不需要更改,函数可以更改指针


这个问题类似于在java中传递对象引用:您可以通过设置字段和调用方法来更改对象的内容,但不能将参数更改为新对象或
null

“C++”+“原始指针”=“自找麻烦”。你做到了,你就有麻烦了。现在去学习标准容器和智能指针,读一本书,而不是盲目地尝试,尤其是来自Java的时候。我不同意。如果你没有得到指示,一定要用一段时间。我也不建议在生产代码中拥有原始指针,但要了解实际发生的事情是非常重要的(毕竟,控制我们为什么使用C++的大部分原因)。@立方,指针很重要,对吧。但在进入它们之前,你需要了解更大的情况;您需要知道该语言(如“语言+标准库”)是如何工作的;在现代C++中,指针是很高级的主题,不应该向初学者展示,因为它们对学习它们没有兴趣——在C++中,你不使用很多原始指针或容器编写的(如果不是代码> S/多/完全在< /代码>…)。