关于struct指针C ++的困惑

时间:2015-12-09 20:49:27

标签: c++ pointers struct

我写了下面这段代码。我有一个问题:在这两行中:

r1 = r;
r1 = new node(); 

我认为当r1成为新的空节点时,r也应该是一个新的空节点,因为r1=r是指针赋值,因此r1和{{ 1}}表示相同的地址。但是我一定是错的,因为结果显示r这里没有改变。有人可以向我解释为什么r没有改变吗?谢谢。

r

结果:

#include<iostream>

using namespace std;

struct node{
    int id;
    node *child;
};


int main()
{
    node *r = new node();
    node *r1 = new node();
    r->id = 100;

    r1 = r;
    r1 = new node();
    r1->child = r;

    cout << "r1 " << r1->id << endl;
    cout << "r1 child " << (r1->child)->id << endl;
}

4 个答案:

答案 0 :(得分:2)

指针就是指针 - 它指向(指向)其他东西。

我认为在这种情况下,以图形方式理解事物可能最容易。所以,在你这样做之后:

        override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows

    var returnCount:Int = 0
    let currentUserId = NSUserDefaults.standardUserDefaults().stringForKey("userId")

    for place in places {
        if place["userID"] == currentUserId {
            returnCount++
        }
    }

    return returnCount

}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)

    let currentUserId = NSUserDefaults.standardUserDefaults().stringForKey("userId")

    let currentPlacesUserId = places[indexPath.row]["userID"]

        if  currentPlacesUserId == currentUserId {

            cell.textLabel!.text = places[indexPath.row]["name"]
            cell.detailTextLabel?.text = places[indexPath.row]["issue"]

        }

    return cell
}

情况大致如下:

enter image description here

然后当你执行:node *r = new node(); node *r1 = new node(); r->id = 100; 时,会出现这样的情况:

enter image description here

请注意,您已泄露r1 = r;指向的node(即,您不再指向它,因此您无法再将其删除)

然后当你r1时:你得到这样的东西:

enter image description here

最后,在执行r1 = new node();之后你会有这样的事情:

enter image description here

答案 1 :(得分:0)

他们不可能是一样的。 rr1是内存中的两个位置,可以将地址保存到node(根据代码中的定义),因此当您执行r1 = r时,这些内存中的值位置变得相同(指针值)。

但是,当您稍后执行r1 = new node;时,new会返回指向新创建对象的指针,该对象仅存储在r1内存位置。由于内存中r位置的地址不会改变,因此您会看到结果。

答案 2 :(得分:0)

  

我有一个问题:在这两行中:r1 = r;r1 = new node();我认为当r1成为新的空节点时,r也应该是一个新的空节点,因为{{1}是一个指针赋值

不。当您执行r1=r时,您所做的就是将r1 = r;的值设置为r1的相同值。它不会将rr1链接在一起,而您在r中更改的任何内容都不会对r1执行任何操作。

您还应注意r导致内存泄漏,因为r1 = r;不再指向您最初创建的节点,并且在分配之前您没有r1

答案 3 :(得分:0)

逐步完成代码可能有助于解释正在发生的事情。

    node *r = new node();

A

创建内存块 A 并指向r
    node *r1 = new node();

B 创建内存块 B 并指向r1

    r->id = 100;

取消引用r找到 A A 中的id设置为100

    r1 = r;

指向r1r相同。 r1现在指向 A A B 之间没有联系。没有任何内容从 A 复制到 B r1仅被重定向到 A 而不是 B

B 不再有任何推荐人而且丢失了。这称为内存泄漏。 delete r1;在重新分配之前阻止这一点。更好,因为 B 从未使用过,所以不要首先分配它。

    r1 = new node();

C 处创建内存块 C 并指向r1。如上所述,r1指向 C 而不是 A 。不会发生复制或其他副作用。 r1 A 之间不再有任何关联。 A 未更改且r仍指向 A

    r1->child = r;

取消引用r1找到 C 。点<{1>}在 C A

child

取消引用 cout << "r1 " << r1->id << endl; 找到 C 。在 C 中打印r1。从未在 C 中为id分配了值,因此使用它是未定义的行为。可以打印任何值,不打印任何值,或者程序可能会导致计算机长腿并吃掉邻居的猫,尽管这不太可能。

id

取消引用 cout << "r1 child " << (r1->child)->id << endl; 找到 C 。在 C 中取消引用r1以找到 A 。在 A ,100。

中打印child