C++ C++;指针故障
我有以下代码的问题。我是一个java开发者,试图自学C++。main()中的代码基本上没有向根节点插入任何内容。有人能帮我吗。我确信我的指针有问题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
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/多/完全在< /代码>…)。