在C++中,对传递给调用函数中反映的函数的指针的更改是什么?

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.调用者确实可以看到这种变化.