C++ 在C++;,对传递给函数的指针的更改是否反映在调用函数中?
如果我将指针p从函数f1传递到函数f2,并修改f2中p的内容,这些修改会自动反映在f1中吗 例如,如果需要删除链接列表中的第一个节点: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所做的更改是否会反映在调用函数中,或者它现在是否指向已释放的内存空间 (我在这里的直觉回答是否定的,没有反映出变化。但是,好的消息来源告诉我,上面的代码会起作用。有人能花时间给出答案并解释其背后的原因
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中使用的令人费解的技术术语是“指针引用的存储器”;-)