web-dev-qa-db-fra.com

La fonction ne change pas le pointeur passé C ++

J'ai ma fonction et je remplis targetBubble là, mais elle n'est pas remplie après avoir appelé cette fonction, mais je sais qu'elle a été remplie dans cette fonction parce que j'ai là du code de sortie.

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

Et je passe le pointeur comme ça

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

Pourquoi ça ne marche pas s'il vous plait? Merci

40
c0ntrol

Parce que vous passez une copie du pointeur. Pour changer le pointeur, vous avez besoin de quelque chose comme ceci:

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

ou

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

Vous passez le pointeur par valeur.

Passez un référence au pointeur si vous voulez le mettre à jour.

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

si tu écris

int b = 0;
foo(b);

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

vous ne changez pas "b" car a est une copie de b

si vous voulez changer b, vous devrez passer l'adresse de b

int b = 0;
foo(&b);

int foo(int *a)
{
  *a = 1;
}

il en va de même pour les pointeurs:

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
}

pour changer où b pointe pour passer l'adresse:

int* b = 0;
foo(&b);

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

hth

20
Anders

Vous ne pouvez pas changer le pointeur à moins de le passer par une référence (non constante) ou comme un double pointeur. Le passage par valeur crée une copie de l'objet et toutes les modifications apportées à l'objet sont apportées à la copie, pas à l'objet. Vous pouvez modifier l'objet vers lequel pointe le pointeur, mais pas le pointeur lui-même si vous passez par valeur.

Lisez cette question pour mieux comprendre les différences plus en détail quand passer par référence et quand passer par pointeur en C++?

8
mathematician1975