ホームページ  >  記事  >  バックエンド開発  >  非 const ポインターを使用して「const」変数を変更すると、機能しているように見えても、実際にはその値が変更されないのはなぜですか?

非 const ポインターを使用して「const」変数を変更すると、機能しているように見えても、実際にはその値が変更されないのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-10-28 08:35:02138ブラウズ

Why Does Modifying a `const` Variable Through a Non-Const Pointer Seem to Work, but Doesn't Actually Change Its Value?

非 Const ポインターを使用した const の変更

C では、 const 変数は、一度初期化されると変更できません。ただし、特定のシナリオでは、const 変数が変更されたように見える場合があります。次のコードを考えてみましょう:

<code class="cpp">const int e = 2;

int* w = (int*)&e;        // (1)
*w = 5;                   // (2)

cout << *w << endl;          // (3)
cout << e << endl;             // (4)</code>

このコードを実行すると、予期せぬ動作に気づくでしょう:

5
2

(2) で *w が 5 に変更されたにもかかわらず、 e はまだ元の値 2 を保持しています。この一見矛盾した動作は、次の要因から生じています:

  • (1) const ポインター (w) の逆参照により変更が可能になります。
  • (2) ) 変更された値は、w が指すメモリ位置に格納されます。この場合、これは e が格納されているメモリ位置です。
  • ただし、コンパイラは e をコンパイル時の定数として扱い、コードを最適化します。

その結果、*w が実行時に評価されると、変更された値 (5) が返されます。ただし、 e がコンパイル時に評価されるときは、元の値 (2) が使用されます。

この動作は、C では未定義の動作として知られています。 const 変数を直接的または間接的に変更すると、予期しない結果が生じるため、そのような状況では注意が必要です。

以上が非 const ポインターを使用して「const」変数を変更すると、機能しているように見えても、実際にはその値が変更されないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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