Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C++;,对传递给函数的指针的更改是否反映在调用函数中?_C++_Pointers_Parameter Passing - Fatal编程技术网

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

C++ 在C++;,对传递给函数的指针的更改是否反映在调用函数中?,c++,pointers,parameter-passing,C++,Pointers,Parameter Passing,如果我将指针p从函数f1传递到函数f2,并修改f2中p的内容,这些修改会自动反映在f1中吗 例如,如果需要删除链接列表中的第一个节点: void f2( Node *p) { Node *tmp = p; p = p -> next; delete tmp; } 对p所做的更改是否会反映在调用函数中,或者它现在是否指向已释放的内存空间 (我在这里的直觉回答是否定的,没有反映出变化。但是,好的消息来源告诉我,上面的代码会起作用。有人能花时间给出答案并解释其背后的原因

如果我将指针p从函数f1传递到函数f2,并修改f2中p的内容,这些修改会自动反映在f1中吗

例如,如果需要删除链接列表中的第一个节点:

void f2( Node *p)
{
    Node *tmp = p;
    p = p -> next;
    delete tmp;
}
对p所做的更改是否会反映在调用函数中,或者它现在是否指向已释放的内存空间

(我在这里的直觉回答是否定的,没有反映出变化。但是,好的消息来源告诉我,上面的代码会起作用。有人能花时间给出答案并解释其背后的原因吗?另外,如果上面的代码有错,我们如何在不使用返回类型的情况下实现这一点?)

如果我将指针p从函数f1传递到函数f2,并修改f2中p的内容,这些修改会自动反映在f1中吗

< C > +,因为C和C++实现了逐值,指针传递到函数时的值被复制。只修改本地副本,并且在函数离开时不会复制回值(这将是一些语言支持的通过引用复制)

如果您希望修改原始值,则需要传递对指针的引用,即将
f2
的签名更改为:

void f2( Node*& p)

然而,您的
f2
不仅更改指针
p
,还通过使用
delete
更改其基础值(=所指向的值)。调用者确实可以看到该更改。

这将起作用,尽管不是您想要的方式

如果你这样称呼它:

Node* mynode = new Node(); /*fill data*/
f2(mynode);
->将有mynode的内容未定义

它会将指针的值传递给另一个函数,而值(p)将是函数f2的局部值。如果要修改它,请使用以下方法:

Node* mynode = new Node(); /*fill data*/
f2(&mynode);

void f2(Node** p)
{
 Node* tmp = *p;
 *p = (*p)->next;
 delete tmp;
}

有什么好的资源告诉你这一点?它们是错误的,应该纠正。
删除tmp
C
中的语法错误。你的标签正确吗?标记
C
removedNo,它不是未定义的–它只是保持不变(或者您是说“内容”所指的“指针对象”)。该值不变,但以任何方式将该值用作指针(例如,将其与包含空指针的另一个指针值进行比较)是未定义的。通过逐字节检查,您可以有效地观察到表示形式没有改变。@Steve:因为它很有趣…:只有在指针不指向数组的元素(或数组最后一个元素之后的元素)时,在比较中使用指针才是未定义的;;-)因此,是的,这个示例代码确实是无效的–前提是
new
没有重载以从数组缓冲区内部分配存储。@Konrad:touché。我未说明的假设是,
delete
对其操作数调用一个标准的释放函数。此外:如果您想在C中更改一个值,您唯一的选择就是传递地址。i、 e.
void f2(节点**p)
“它也改变了它的基础值”:这里的“基础值”==“refereand”?是。如果我们想学究化,本标准3.7.3.2/4中使用的令人费解的技术术语是“指针引用的存储器”;-)