ホームページ >バックエンド開発 >C++ >C でポインタツーポインタを非 Const にポインタツーポインタを Const に変換できないのはなぜですか?

C でポインタツーポインタを非 Const にポインタツーポインタを Const に変換できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-01 02:42:09490ブラウズ

Why Can't I Convert a Pointer-to-Pointer to Non-Const to a Pointer-to-Pointer to Const in C  ?

ポインターの変換: ポインターからポインターへの変換に制限があるのはなぜですか?

C では、一般に、ポインターを非オブジェクトにキャストすることが許可されています。 -const 型は const 型へのポインタへ。これは「定数の正確性」の原則に従っており、定数データのみを変更できます。

ただし、ポインターへのポインターを扱う場合には特有の例外が発生します。前述の変換とは異なり、「非 const へのポインターへのポインター」を「const へのポインターへのポインター」に変換することは禁止されています。

次のコード スニペットを考えてみましょう。

char *s1 = 0;
const char *s2 = s1; // OK...
char *a[MAX]; // aka char **
const char **ps = a; // error!

理由ps への a の代入は違法ですか?答えは標準にあります:

const char c = 'c';
char* pc;
const char** pcc = &pc;   // not allowed
*pcc = &c;
*pc = 'C';                // would allow to modify a const object

この例では:

  1. c は定数文字です。
  2. pc は a への非定数ポインタです。 Character.
  3. &pc を使用して pcc (const へのポインタへのポインタ) を初期化しようとしています。

この変換が許可されると、定数オブジェクトの変更が可能になります。たとえば、*pcc は const 文字を指しますが、*pc は変更可能です。これは、定数データへの変更を許可する可能性があるため、const の正確性の前提に違反します。

したがって、ポインタから非 const へのポインタから const へのポインタへのポインタへの変換に関する制限は、以下の必要性から生じます。定数オブジェクトの整合性を維持し、意図しないデータ変更を防ぎます。

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

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