ホームページ >バックエンド開発 >C++ >C 関数に渡されるポインターを変更し、その変更を呼び出しスコープに反映するにはどうすればよいですか?

C 関数に渡されるポインターを変更し、その変更を呼び出しスコープに反映するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-26 10:15:16441ブラウズ

How Can I Modify a Pointer Passed to a C   Function and Reflect Those Changes in the Calling Scope?

関数の動作: C でのポインターの受け渡し

C では、ポインターを関数に渡すと、呼び出し元のスコープ内の元の変数を変更できます。 。ただし、ポインタを扱う場合、特定のニュアンスが生じる可能性があります。

問題:

次の例のように、渡されたポインタを変更する関数を考えてみましょう:

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

関数内で「targetBubble」ポインターを変更しても、変更は外部には反映されません。

理由と解決策:

この問題は、ポインターへの参照ではなく、ポインターのコピーを渡すことに起因します。これを修正するには、次のテクニックを利用できます。

  1. ポインタからポインタへ:
    ポインタをポインタに渡すことで、元のポインタを変更できます。 pointer:

    void foo(int **ptr) //pointer to pointer
    {
        *ptr = new int[10]; //just for example, use RAII in a real world
    }
  2. ポインターへの参照:
    元のポインターを直接変更するポインターへの参照を渡します:

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

いずれかのアプローチを実装すると、ポインタを効果的に変更できます。スコープを呼び出して、関数内で行われた変更が外部に確実に反映されるようにします。

以上がC 関数に渡されるポインターを変更し、その変更を呼び出しスコープに反映するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。