我希望结果是未定义的,但输出是“10”,为什么?
我想在函数被调用后内存被破坏了。
#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}
我希望结果是未定义的,但输出是“10”,为什么?
我想在函数被调用后内存被破坏了。
#include <iostream>
void f(int *p)
{
int l = 20;
int *k = &l;
p = k;
}
int main()
{
int i = 10;
int *j = &i;
f(j);
std::cout << *j;
return 0;
}
结果不是未定义的。j
您通过value传递指针,因此您在函数内修改它的副本。原件j
保持不变,所以结果仍然是10
.
该程序结构良好,因为在外部没有访问局部变量l
,因为指针f()
在j
(main()
指针的副本j
被传递到f()
)中没有改变。
让我们分解你的代码。
您首先将 10 分配给i
. 然后j
指出 的地址i
。
在 f 中,您将 的值p
而不是它指向的值设置为k
。作为 的参数传递f()
,p 值被复制(地址值)。
因此,您永远不会修改 所指向的值,只是inj
的局部值,这就是它保持等于 的原因。j
f()
10
There is absolutely nothing wrong with the code. The parameter of f
is not passed by reference, so f
has no way to modify j
, therefore j
still points to i
after f
exits.
您对按引用传递/按值传递感到困惑。当你传递一个指针时,指针本身是一个数字,你传递给f()
指向一块内存的函数;修改 *p 变量f()
(而不是*p
指向的内存块)对main()
函数没有影响。
A pointer is just a variable that holds an address of memory. In itself, it is passed by value; only the variable to which the pointer points is passed by reference.