c ++将内部函数指针复制到对象到函数传递指针时,值不会改变

时间:2016-11-27 21:23:09

标签: c++ pointers

我想将指针更改为指向的位置,但不成功 这就是我所拥有的:

class Test {
public:
    Test() {};
    ~Test(){};
    int foo;
};
void ToPointer(Test *tst)
{
    Test* t1 = new Test();
    t1->foo = 111222;
    tst = t1;
}

Test *t2 = new Test();
t2->foo = 2;
ToPointer(t2);
int fff = t2->foo;

fff的结果仍为2
我希望t2指向t1或列表复制其所有值
在这里我只是用foo简化它,但在现实生活中,对象要复杂得多 我不使用什么引用指针(*&)

3 个答案:

答案 0 :(得分:2)

当您将t2传递给ToPointer(Test * tst)时,正在发生的事情是ToPointer()正在制作该指针的本地副本。然后你将tst分配给t1,但是所做的就是分配那个本地副本。在主要的一个仍将坐在那里未受影响。当函数返回时,ToPointer中的本地副本将会死亡。你可以做很多事情,比如将指针作为指针指向Test **,或者引用指针Test *&,或者像user64322表示,返回一个指针,或者返回一个引用指向一个指针对于指针,选择是无限的。

答案 1 :(得分:1)

您的代码的问题是

假设T2指针在

0x1000

指向0X2000 和tsk指针

0x1010 also pointing to 0x2000

现在t1指针位于

0x3000

and pointong at let say

0x4000

现在你已经完成了tsk = t1

表示tsk将指向0x4000

并记住,t2仍为0x1000,指向0x2000

其中一个解决方案是  返回t1

Test *ToPointer()
{
    Test* t1 = new Test();
    t1->foo = 111222;
    return t1;
}
int main()
{
    Test *t2 = new Test();
    t2->foo = 2;
    t2 = ToPointer();
    int fff = t2->foo;
    std::cout<<fff;
}

答案 2 :(得分:1)

由于指针是按值传递的,并且您不希望使用引用指针,因此您可以像这样使用指针指针:

#include <iostream>

using namespace std;

class Test {
public:
    Test() {};
    ~Test(){};
    int foo;
};

// tst will be a pointer to the pointer (address) of the Test instance.
void ToPointer(Test** tst)
{
    Test* t1 = new Test();
    t1->foo = 111222;
    *tst = t1;  // you can use the pointer tst, 
                // even though it is a copy of the original argument,
                // because it points to the pointer that points to the Test instance.
}

int main()
{
    Test* t2 = new Test();  // t2 stores the address of the Test instance
    t2->foo = 2;
    ToPointer(&t2);         // send ToPointer() the address of t2, 
                            // which is itself a pointer to the Test instance
    int fff = t2->foo;
    cout << fff << endl;    // verify that fff is 111222

    return (0);
}