Sha*_*ala 2 c++ pointers parameter-passing
如果我将指针P从函数f1传递到函数f2,并修改f2中的P的内容,这些修改会自动反映在f1中吗?
例如,如果我需要删除链表中的第一个节点:
void f2( Node *p)
{
Node *tmp = p;
p = p -> next;
delete tmp;
}
Run Code Online (Sandbox Code Playgroud)
对P的更改是否会反映在调用函数中,还是现在指向已释放的内存空间?
(我在这里的直观答案是否定的,没有反映变化.但是,好的消息来源告诉我上面的代码会起作用.有人可以花时间给出答案并解释它背后的推理吗?另外,如果上面的代码是错误的,我们如何在不使用返回类型的情况下实现这一点?)
Kon*_*lph 11
如果我将指针P从函数f1传递到函数f2,并修改f2中的P的内容,这些修改会自动反映在f1中吗?
不可以.由于C和C++实现了pass-by-value,指针的值是 传递给函数时会复制.只修改了本地副本,并且在保留该函数时不会复制该值(这将是一些语言支持的引用复制).
如果要修改原始值,则需要传递对指针的引用,即更改您的签名f2为:
void f2( Node*& p)
Run Code Online (Sandbox Code Playgroud)
但是,您f2不仅更改了指针p,还通过使用更改其基础值(=指向的值)delete.调用者确实可以看到这种变化.