我写了下面这段代码。我有一个问题:在这两行中:
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;
}
答案 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
}
情况大致如下:
然后当你执行:node *r = new node();
node *r1 = new node();
r->id = 100;
时,会出现这样的情况:
请注意,您已泄露r1 = r;
指向的node
(即,您不再指向它,因此您无法再将其删除)
然后当你r1
时:你得到这样的东西:
最后,在执行r1 = new node();
之后你会有这样的事情:
答案 1 :(得分:0)
他们不可能是一样的。 r
和r1
是内存中的两个位置,可以将地址保存到node
(根据代码中的定义),因此当您执行r1 = r
时,这些内存中的值位置变得相同(指针值)。
但是,当您稍后执行r1 = new node;
时,new
会返回指向新创建对象的指针,该对象仅存储在r1
内存位置。由于内存中r
位置的地址不会改变,因此您会看到结果。
答案 2 :(得分:0)
我有一个问题:在这两行中:
r1 = r;r1 = new node();
我认为当r1
成为新的空节点时,r
也应该是一个新的空节点,因为{{1}是一个指针赋值
不。当您执行r1=r
时,您所做的就是将r1 = r;
的值设置为r1
的相同值。它不会将r
和r1
链接在一起,而您在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;
指向r1
与r
相同。 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