2

我可以在这个片段中找到问题所在:

我想在函数中重置一个指针,我通过返回指针实现了它的工作,但我无法通过副作用(通过指针传递)来实现它。

void function(Object * obj)[{
    obj = new Object();
    cout << obj << endl;
    //return obj;
}

main(){
    Object * obj = 0;
    function(obj);
    cout << obj << endl;
}

在这种情况下,结果是:

0x12345678
0

虽然它应该是

0x12345678
0x12345678

我尝试使用指针指针或引用指针,但仍然无法通过该函数。虽然只是返回价值就像一个魅力。但是我需要在几个参数上执行此操作,并且代码比这里显示的要复杂得多。

4

3 回答 3

3

如果您像这样更改函数声明,它应该可以工作:

void function(Object  * &obj)

在您的原始代码中,您通过值传递指针,这意味着函数制作了指针的副本,并且对函数中指针的任何更改都不会反映。当您通过引用传递时,您实际上是在处理原始数据,这可能会在幕后使用指针完成。

于 2013-05-29T16:27:21.747 回答
0

你可能想看看这个话题

通过指针指针返回对象(C方式):

void function(Object ** obj) {
  *obj = new Object();
}


main(){
  Object * obj = 0;
  function(&obj);
...

通过引用指针返回对象(C++ 方式):

void function(Object *& obj) {
  obj = new Object();
}

main(){
  Object * obj = 0;
  function(obj);
...
于 2013-05-29T16:29:04.137 回答
0

你打电话时

void function(Object * obj){

您正在复制指针 obj,换句话说,“函数”的堆栈现在包含名为 obj 的指针的本地副本。当函数返回时,这个本地副本被销毁。你可以通过以下方式实现你想要的:

void function(Object* obj&){

这实际上将通过引用传递调用者的 obj 指针。现在对 obj 的任何更改也将反映在调用者的范围内。

于 2013-05-29T16:36:14.687 回答