ポインターの変換: ポインターからポインターへの変換に制限があるのはなぜですか?
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
この例では:
この変換が許可されると、定数オブジェクトの変更が可能になります。たとえば、*pcc は const 文字を指しますが、*pc は変更可能です。これは、定数データへの変更を許可する可能性があるため、const の正確性の前提に違反します。
したがって、ポインタから非 const へのポインタから const へのポインタへのポインタへの変換に関する制限は、以下の必要性から生じます。定数オブジェクトの整合性を維持し、意図しないデータ変更を防ぎます。
以上がC でポインタツーポインタを非 Const にポインタツーポインタを Const に変換できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。