为什么变量不通过传递指针更改?

时间:2018-07-06 05:26:06

标签: c++

draw()之后,n为何仍指向默认节点?

我正在尝试传递指向draw()的节点的指针,并使其指向draw()内新创建的节点。

#include <iostream>

using namespace std;

struct node{
   int key;
   struct node *l, *r;
   int level, place;
};

int keyCounter = 0;

void draw(struct node *t, int low, int high, int storey){
   if(storey == 0) return;
   t = new node();
   t->key = ++keyCounter;
   t->level = storey;
   int mid = (low + high) / 2;
   t->place = mid;
   draw(t->l, low, mid, storey - 1);
   draw(t->r, mid, high, storey - 1);
}

void visit(struct node *t){
   if(t != NULL){
      cout << t->key << ' ' << t->level << ' ' << t->place << '\n';
      visit(t->l);
      visit(t->r);
   }
}

int main(){
   struct node *n = new node();
   draw(n, 0, 64, 6); 
   visit(n);
   return 0;
}

3 个答案:

答案 0 :(得分:0)

在方法draw中,您将t设置为指向另一个node

t = new node();

现在t指向另一个存储空间。这不是n指向的空间。更改t属性时,您不会更改node指向的n。删除我在上面指定的行。

答案 1 :(得分:0)

如果您真的想更改n指向的内容,请使用对指针的引用

void draw(struct node& *t, int low, int high, int storey){

此外,不要忘记释放您传递的指针。但是,建议您再次认真考虑您的设计。

答案 2 :(得分:0)

您的代码对于谁分配posted_reddit_ids = "/full_path_of_file/oldies.txt" 感到困惑。您需要执行两次-在n中一次,在main()中一次。这显然是不明智的。

一个显而易见的问题是:为什么不将draw()传递给n,因为它什么都不做?相反,请尝试以下操作:

draw()

然后:

struct node *draw (int low, int high, int storey)
{
    if(storey == 0) return nullptr;
    t = new node();
    ....
    return t;
}

当然,现在是2018年,您完全不应该使用原始指针,而应该使用that's another story。而且拥有名为int main() { struct node *n = draw(0, 64, 6); if (n) visit(n); return 0; } 的函数来分配对象也有点不可思议。也许应该将其称为draw