函数不会改变传递指针C ++

时间:2012-08-07 08:54:26

标签: c++ function pointers

我有我的功能,我在那里填充targetBubble,但在调用此函数后它没有被填充,但我知道它已填充此函数,因为我有输出代码。

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

我正在传递像这样的指针

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

为什么它不起作用?感谢

4 个答案:

答案 0 :(得分:76)

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

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];
}

答案 1 :(得分:24)

您正在按值传递指针。

如果要更新,请将引用传递给指针

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

答案 2 :(得分:20)

如果你写

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

答案 3 :(得分:7)

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

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