webentwicklung-frage-antwort-db.com.de

Die Funktion ändert den übergebenen Zeiger C ++ nicht

Ich habe meine Funktion und fülle dort targetBubble, aber sie wird nicht gefüllt, nachdem ich diese Funktion aufgerufen habe, aber ich weiß, dass sie in diese Funktion gefüllt wurde, weil ich dort einen Ausgabecode habe.

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

Und ich übergebe den Zeiger so

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

Warum funktioniert es bitte nicht? Vielen Dank

40
c0ntrol

Weil Sie eine Kopie des Zeigers übergeben. Zum Ändern des Zeigers benötigen Sie Folgendes:

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

oder

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

Sie übergeben den Zeiger als Wert.

Übergeben Sie ein Verweis auf den Zeiger, wenn Sie ihn aktualisieren möchten.

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

wenn du schreibst

int b = 0;
foo(b);

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

sie ändern 'b' nicht, da a eine Kopie von b ist

wenn Sie b ändern möchten, müssen Sie die Adresse von b übergeben

int b = 0;
foo(&b);

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

gleiches gilt für Hinweise:

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
}

so ändern Sie, wo b zeigt, um die Adresse zu übergeben:

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

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

hth

20
Anders

Sie können den Zeiger nur ändern, wenn Sie ihn als (nicht konstanten) Verweis oder als Doppelzeiger übergeben. Durch die Übergabe des Werts wird eine Kopie des Objekts erstellt, und alle Änderungen am Objekt werden an der Kopie und nicht am Objekt vorgenommen. Sie können das Objekt ändern, auf das der Zeiger zeigt, aber nicht den Zeiger selbst, wenn Sie einen Wert übergeben.

Lesen Sie diese Frage durch, um die Unterschiede genauer zu verstehen. Wann als Referenz übergeben und wann als Zeiger in C++ übergeben?

8