ホームページ >バックエンド開発 >C++ >C 関数でポインタを変更しても元のポインタが変更されないのはなぜですか?

C 関数でポインタを変更しても元のポインタが変更されないのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-27 07:17:09263ブラウズ

Why Doesn't Modifying a Pointer in a C   Function Change the Original Pointer?

関数は C で渡されたポインターを変更しない

C では、関数に渡されたポインターを変更しようとすると混乱が発生します。問題は、ポインターの固有の性質にあります。関数が引数としてポインターを受け取ると、実際には元のポインター自体ではなく、そのポインターのコピーに対して動作します。

関数の例を考えてみましょう。 clickOnBubble:

bool clickOnBubble(sf::Vector2i &mousePos, std::vector<Bubble *>& bubbles, Bubble *targetBubble) {
    // ... your code
}

ポインタをパラメータとして指定すると、関数はローカル スコープ内にそのポインタの新しいコピーを作成します。ポインターのローカル コピーに加えられた変更は、関数の外部にある元のポインターには影響しません。上記のシナリオでは、コードは関数内のバブル ベクトルの要素に targetBubble を割り当てようとしますが、この割り当ては targetBubble のローカル コピーのみを変更します。

関数の外でポインターを効果的に変更するには、次のいずれかを使用します。ポインターへのポインター、またはポインターへの参照。これにより、関数が元のポインタにアクセスして変更できるようになります。

ポインタへのポインタの使用:

void foo(int **ptr) {
    *ptr = new int[10]; // Assign memory to the pointed-to location
}

この例では、関数 foo はポインタを受け取ります。引数としてポインタを指定します。ポインタ自体を変更して、新しい値を割り当てることができるようになりました。

ポインタへの参照の使用:

void bar(int *&ptr) {
    ptr = new int[10]; // Assign memory to the pointed-to location
}

ここで、関数バーはポインタへの参照。元のポインタに直接アクセスして変更できます。

以上がC 関数でポインタを変更しても元のポインタが変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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