48

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

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

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

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

なぜ機能しないのですか?

4

4 に答える 4

98

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

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];
}
于 2012-08-07T08:55:57.380 に答える
31

ポインタを値で渡します。

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

bool clickOnBubble(sf::Vector2i& mousePos, std::vector<Bubble *> bubbles, Bubble *& t)
于 2012-08-07T08:56:49.580 に答える
26

あなたが書くなら

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
}

h番目

于 2012-08-07T09:02:33.250 に答える
8

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

この質問を読んで、違いをより詳細に理解するのに役立ててください。C++で参照を渡すタイミングとポインターを渡すタイミングを教えてください。

于 2012-08-07T08:56:18.177 に答える