【问题标题】:Function does not change passed pointer C++函数不会更改传递的指针 C++
【发布时间】:2012-08-04 06:12:09
【问题描述】:

我有我的函数,我在那里填写targetBubble,但是调用这个函数后没有填写,但我知道它是填写在这个函数中,因为我有输出代码。

bool clickOnBubble(sf::Vector2i & mousePos, std::vector<Bubble *> bubbles, Bubble * targetBubble) {
    targetBubble = bubbles[i];
}

我正在像这样传递指针

Bubble * targetBubble = NULL;
clickOnBubble(mousePos, bubbles, targetBubble);

为什么它不起作用?

【问题讨论】:

    标签: c++ function pointers


    【解决方案1】:

    因为您正在传递指针的副本。要更改指针,您需要这样的东西:

    void foo(int **ptr) //pointer to pointer
    {
        *ptr = new int[10]; //just for example, use RAII in a real world
    }
    

    void bar(int *& ptr) //reference to pointer (a bit confusing look)
    {
        ptr = new int[10];
    }
    

    【讨论】:

    • 但是当我尝试你的方法时它会在这条线上崩溃*targetBubble = bubbles[i]; 我正在传递这样的参数clickOnBubble(mousePos, bubbles, &amp;targetBubble);
    • @user1295618:你看到了什么错误?可能 i 超出范围
    • @user1295618:请提出一个新问题并在那里发布您的新代码。因为没有看到你的实际代码很难说是什么问题
    • @user1295618:它们是相同的,应该都可以工作。可能您的程序中有未定义的行为,并且每次启动的工作方式都不同
    • @Andrew 第一个可以通过指针解引用导致分段错误?
    【解决方案2】:

    您正在按值传递指针。

    如果您希望更新指针,请传递 对指针的引用

    bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
    

    【讨论】:

    • +1。第一个在 C++ 上下文中正确的答案。建议双重间接指针的答案是旧的 C 方法。
    【解决方案3】:

    如果你写

    int b = 0;
    foo(b);
    
    int foo(int a)
    {
      a = 1;
    }
    

    你不会改变 'b' 因为 a 是 b 的副本

    如果你想改变 b 你需要传递 b 的地址

    int b = 0;
    foo(&b);
    
    int foo(int *a)
    {
      *a = 1;
    }
    

    指针也一样:

    int* b = 0;
    foo(b);
    
    int foo(int* a)
    {
      a = malloc(10);  // here you are just changing 
                       // what the copy of b is pointing to, 
                       // not what b is pointing to
    }
    

    所以要改变b指向的传递地址:

    int* b = 0;
    foo(&b);
    
    int foo(int** a)
    {
      *a = 1;  // here you changing what b is pointing to
    }
    

    【讨论】:

      【解决方案4】:

      除非您通过(非 const)引用或作为双指针传递指针,否则您无法更改指针。按值传递会生成对象的副本,并且对对象的任何更改都是针对副本而不是对象进行的。如果按值传递,则可以更改指针指向的对象,但不能更改指针本身。

      阅读此问题以帮助更详细地了解差异When to pass by reference and when to pass by pointer in C++?

      【讨论】:

        猜你喜欢
        • 2021-08-09
        • 2020-08-12
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多