【问题标题】:Unexpected behavior of arrow operator "->" in c++c++ 中箭头运算符“->”的意外行为
【发布时间】:2020-09-09 14:51:44
【问题描述】:

我提供的代码是简单的 BST,只有插入和中序遍历。

struct Node{
    int data;
    Node* left;
    Node* right;
};

Node* create(int data){
    Node* node = new Node;
    node -> data = data;
    node->left=node->right=NULL;
    return node; 
}

Node* insert(Node* ptr,int item);
void inorder(Node* ptr);

int main(){
    Node* root = NULL;
    int temp,ch;
    root = insert(root, 10);
    root = insert(root, 20);
    root = insert(root, 30);

    inorder(root);
    cout<<endl;
}

Node* insert(Node* ptr,int item){
    if(ptr==NULL){
        cout<<"Inserted "<<item<<endl;
        return create(item);
    }
    if(item<ptr->data){
        // ptr = ptr->left;
        // ptr = insert(ptr, item)
        ptr->left=insert(ptr->left, item);
    }
    else{
        // ptr=ptr->right;
        // ptr = insert(ptr, item)
        ptr->right=insert(ptr->right, item);
    }
    return ptr;
}

void inorder(Node* ptr){
    if(ptr==NULL)
        return;
    inorder(ptr->left);
    cout<<ptr->data<<" ";
    inorder(ptr->right);
}

当我使用时,

ptr = ptr->left;
ptr = insert(ptr, item)

而不是

ptr->left=insert(ptr->left, item);

中序遍历只打印最后插入的元素。

请说明是c++的问题还是我对该概念的理解有误?

【问题讨论】:

  • 一个是“将ptr->left的值复制到ptr,改变ptr”另一个是“改变ptr->left”
  • ptr 是一个局部变量。重新分配它(根据您的第一个版本)不会影响任何其他对象
  • 尝试使用调试器单步调试代码。

标签: c++ pointers binary-search-tree


【解决方案1】:

代码的重要部分是:

Node* insert(Node* ptr,int item){

为了便于解释,考虑你这样称呼它:

Node x;
Node* p = &x;
insert(p, 42);

这里p是按值传递的。它是一个指针。如果您修改ptr,则更改将仅适用于本地ptr,而不适用于p

如果您分配给ptr-&gt;first,那么您正在修改ptr 指向的对象。即使指针是按值传递的,ptr 确实指向与p 相同的对象。即:函数内部的ptr-&gt;first = something;确实修改了x的成员。

【讨论】:

    【解决方案2】:
    ptr->left=insert(ptr->left, item);
    

    将更改ptr 对象的内容。它执行插入并存储它。

    但是,当你这样做时:

    ptr = ptr->left;
    ptr = insert(ptr, item)
    

    你首先得到一个指向 ptr-&gt;left 指向的指针,你以同样的方式插入。但返回值不会存储在您的 original ptr 对象中。

    所以,没有什么奇怪的。我知道让你完全理解它的唯一方法是画一棵树。有一个显示对象的框和一个指向它的指针,对于每个操作,更新您的绘图。应该很清楚了。

    【讨论】:

      猜你喜欢
      • 2012-12-04
      • 1970-01-01
      • 2023-03-09
      • 2012-10-12
      • 2011-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多