【问题标题】:c++ Make pointer point to another inside a functionc ++使指针指向函数内部的另一个
【发布时间】:2018-05-27 13:06:49
【问题描述】:

我正在做一些事情,导致我遇到类似于以下示例的情况。我希望 btest() 之后指向 a。是否有可能,或者创建副本是唯一的解决方案?

谢谢。

void test(Object* a, Object* b)
{
    std::cout << "test a: " << a << std::endl;
    std::cout << "test b: " << b << std::endl;
    b = a;
    std::cout << "test b assigned: " << b << std::endl;
}

int main()
{
    Object* a = new Object();
    Object* b = nullptr;
    test(a, b);
    std::cout << "a: " << a << std::endl;
    std::cout << "b: " << b << std::endl;
    delete a;
    delete b;
}

test a: 0x1aa8930
test b: 0
test b assigned: 0x1aa8930
a: 0x1aa8930
b: 0

【问题讨论】:

  • 不幸的是你不能,因为你传递的是 b 的值,而不是它的引用(或指针),这是修改它所必需的。只有当函数接收到这些变量的地址时,变量才能被函数修改,并且只能通过指针(所以你有 Object**)或引用(Object* &)
  • 除了 Paul:void test(Object *a, Object *&amp;b) 也可以。
  • 没有void main()这样的东西
  • 你想要一个双指针(指向指针的指针 - **b)或对指针的引用。

标签: c++ pointers


【解决方案1】:

要修改指针,您需要:

  • 将指针传递给您的指针
    void test(Object **a, Object **b)
    test(&amp;a,&amp;b);
    之后,如果要更改指针,则需要取消引用。
  • 传递对指针的引用
    void test(Object *&amp;a, Object *&amp;b)
    test(a,b);
    如果您想更改地址,则无需取消引用任何内容。

对于a,您不一定必须传递指向指针的指针或指向指针的引用(除非您计划将来也修改它),但对于b,您必须这样做才能修改它。

附:将您的 void main() 更改为 int main()

【讨论】:

    【解决方案2】:

    你可以这样做:

    void test(Object* a, Object*& b)
    {
        std::cout << "test a: " << a << std::endl;
        std::cout << "test b: " << b << std::endl;
        b = a;
        std::cout << "test b assigned: " << b << std::endl;
    }
    
    int main()
    {
        Object* a = new Object();
        Object* b = NULL;
        test(a, b);
        std::cout << "a: " << a << std::endl;
        std::cout << "b: " << b << std::endl;
        delete a, b;
    }
    

    输出将是:

    test a: 0x7a0d28
    test b: 0
    test b assigned: 0x7a0d28
    a: 0x7a0d28
    b: 0x7a0d28
    

    这是因为在问题中,您传递了 b 的值,而不是对它的引用,这是修改它所必需的。只有当函数接收到这些变量的地址时,该函数才能修改变量,并且只能通过指针 (Object**) 或引用 (Object* &) 来完成

    【讨论】:

    • 您应该解释为什么您发布的内容有效。不要只是放弃代码并在没有解释的情况下说“这样做”。这对了解问题所在没有帮助。例如,参见@StereoBucket 的答案
    • @JesperJuhl 完成
    【解决方案3】:

    现在我们有一个叫做shared_ptr 的东西,它完全可以满足您的需求。此外,您不必在完成后清理它!

    例子:

    #include <memory>
    #include <iostream>
    
    using Object = int;
    
    void test(const std::shared_ptr<Object>& a, std::shared_ptr<Object>& b)
    {
        b = a;
        std::cout << "test b assigned: " << b.get() << "\n";
    }
    
    int main()
    {
        auto a = std::make_shared<Object>();
        std::shared_ptr<Object> b;
    
        std::cout << "test a: " << a.get() << "\n";
        std::cout << "test b: " << b.get() << "\n";
    
        test(a, b);
    
        std::cout << "test a: " << a.get() << "\n";
        std::cout << "test b: " << b.get() << "\n";
    
        return 0;
    }
    

    输出(g++ 5.4.0):

    test a: 0x21e2c30
    test b: 0
    test b assigned: 0x21e2c30
    test a: 0x21e2c30
    test b: 0x21e2c30
    

    live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      相关资源
      最近更新 更多