Подтвердить что ты не робот

Функция не меняет пройденный указатель С++

У меня есть моя функция, и я заполняю targetBubble там, но она не заполняется после вызова этой функции, но я знаю, что она была заполнена этой функцией, потому что у меня есть выходной код.

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

И я передаю указатель вроде этого

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

Почему он не работает, пожалуйста? Благодаря

4b9b3361

Ответ 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];
}

Ответ 2

Вы передаете указатель по значению.

Передайте ссылку на указатель, если вы хотите его обновить.

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

Ответ 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) или как двойной указатель. Передача по значению делает копию объекта, и любые изменения в объекте производятся копией, а не объектом. Вы можете изменить объект, на который указывает указатель, но не сам указатель, если вы пройдете по значению.

Прочитайте этот вопрос, чтобы лучше понять различия в деталях Когда передавать по ссылке и когда передавать указатель на С++?