web-dev-qa-db-ja.com

関数は渡されたポインターC ++を変更しません

関数があり、targetBubbleを埋めていますが、この関数を呼び出した後は埋められませんが、出力コードがあるため、この関数で埋められていることがわかります。

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

そして、私はこのようなポインタを渡しています

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

なぜ機能しないのですか?ありがとう

40
c0ntrol

ポインタのコピーを渡しているからです。ポインターを変更するには、次のようなものが必要です。

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

ポインタを値渡ししています。

更新する場合は、ポインタへの参照を渡します。

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

書いたら

int b = 0;
foo(b);

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

aはbのコピーであるため、「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

20
Anders

(非const)参照またはダブルポインターとして渡さない限り、ポインターを変更することはできません。値渡しはオブジェクトのコピーを作成し、オブジェクトへの変更はオブジェクトではなくコピーに対して行われます。ポインターが指すオブジェクトは変更できますが、値で渡す場合はポインター自体は変更できません。

この質問を読んで、相違点をより詳細に理解するのに役立ててください C++で参照渡しする場合とポインタ渡しする場合

8