【问题标题】:Problem while working with pointers and struct in C++在 C++ 中使用指针和结构时出现问题
【发布时间】:2021-04-26 06:14:50
【问题描述】:

我为this task 编写了笛卡尔树的解决方案。

我的完整code

起初我遇到了非常令人困惑的问题。我有我的结构和两个功能。我需要在我的树上传递指针,做一些动作,然后我需要我的原始对象值,然后再将它传递给函数 calc。

struct item {

    int prior;
    long long key, sum;
    item *l, *r;

    item(long long key, int prior) {
        this->key = key;
        this->sum = key;
        this->prior = prior;
        this->l = nullptr;
        this->r = nullptr;
    }

};

typedef item *pitem;


long long calc(pitem &t, long long l, long long r) {

    pitem first = nullptr, second = nullptr, out = nullptr;
    split(t, l - 1, first, second);
    split(second, r, out, first);

    return sum(out);
}

*附加功能拆分

void split(pitem t, long long key, pitem &l, pitem &r) {
    if (!t) {
        l = r = nullptr;
        return;
    }
    if (key < t->key)
        split(t->l, key, l, t->l), r = t, update_info(r);
    else
        split(t->r, key, t->r, r), l = t, update_info(l);
    update_info(t);
}

起初我试图在函数中传递没有“&”的指针。它没有奏效。之后我尝试创建具有相同值的临时值并在函数中传递这个新对象的指针,但它不起作用甚至更多:我在指针树上的原始对象当时也发生了变化..我用很多事情,但他们没有工作。这就像我尝试创建临时值而不是更改 *t 指针上的主对象,但它仍然会随着它们而改变。 请帮帮我,我在这个问题上只花了你 4 块钱,但仍然不知道该怎么做......

【问题讨论】:

  • “起初我试图在函数中传递没有“&”的指针。它没有奏效。” 那么为什么不放弃尝试这样做呢。你知道通过引用传递参数的作用吗?

标签: c++ object pointers structure


【解决方案1】:

代码不完整,预期行为不明确,但存在一些明显的问题。这段代码

if (!t) {
    l = r = nullptr;
    return;
}

没有意义,trl 不是指针,它们是引用。这段代码甚至不应该编译。在这里,您的代码通过重用相同的变量名属于“如何编写不受支持的代码”的规则之一。当它们都相同时,很难关联各种对象的标识符。

表达式r = tl = t 会改变实际对象,它将t 引用的item 分配给l,反之亦然。在其中之一之后,函数参数引用的两个项目将彼此相等。通过引用传递的函数参数是原始对象的别名。

在函数split 中,第一个参数不是引用,所以如果update_info 打算改变t,它实际上不会改变任何东西。这里的函数参数t是传值的,是一个用参数值初始化的局部变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多