【问题标题】:Function does not change passed pointer C++函数不改变传递的指针 C++
【发布时间】:2021-08-09 03:27:41
【问题描述】:

我有我的函数,我在那里填写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:你看到了什么错误?可能我不在范围内
    • @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
    }
    

    hth

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-08-04
        • 2011-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-12
        相关资源
        最近更新 更多