我正在阅读麻省理工学院的C ++简介,一个代码示例显示:
int *getPtrToFive() {
int *x = new int;
*x = 5;
return x;
}
int main() {
int *p;
for (int i = 0; i < 3; ++i) {
p = getPtrToFive();
cout << *p << endl;
delete p;
}
}
我想知道为什么有可能在每次迭代后删除“p”,尽管在循环开始之前声明了一次“p”并且没有使用“new”分配。
另一个问题是当“* x”在函数中被赋值为5时,因为它是一个指针,内存地址会被改变吗?那么它会是0x00005而不是实际值5?
答案 0 :(得分:6)
我想知道为什么有可能在每次迭代后删除“p”,尽管在循环开始之前声明了一次“p”并且没有使用“new”分配
没有。您没有删除p
,而是删除对象p指向,每次迭代使用new
分配。
另一个问题是当“* x”在函数中被赋值为5时,因为它是一个指针,内存地址会被改变吗?那么它会是0x00005而不是实际值5?
x
的值类似于0xFFd00whatever。但是你要打印*x
的值,这是“地址0xFFd00whatever内存中的数字”。您的代码中没有x=5
;只有*x=5
。这意味着“转到x指向的地址,并将数字5
放在那里”。
你可以这样思考:你有一只手,好吗?我们称之为“x”。命令
x = new int;
意思是“将手指指向桌面上的空位。”其中
*x = 5;
表示“画出你手指向的五号”。
答案 1 :(得分:2)
p
只是int*
类型的变量(指向int
的指针)。它的价值是一个地址。为其分配新值时,它指向一个新对象。 delete
期待一个地址;这就是解除分配内存所需的全部内容。
用于存储所述地址的变量无关紧要。它的值已经改变了,而且delete
都关心了;价值。