ホームページ >バックエンド開発 >C++ >C では、ポインタからポインタから非定数へのポインタからポインタから定数への変換が禁止されているのはなぜですか?

C では、ポインタからポインタから非定数へのポインタからポインタから定数への変換が禁止されているのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-20 15:08:14546ブラウズ

Why is Converting a Pointer-to-Pointer-to-Non-const to a Pointer-to-Pointer-to-const Prohibited in C  ?

ポインターの逆参照: 'ポインターから const へのポインター' への変換が禁止されている理由

C では、ポインターの変換が許可されています-to-non-const から const へのポインター。ただし、ポインタからポインタから非定数へのポインタからポインタから定数への変換は許可されません。ここで疑問が生じます: なぜですか?

この制限の背後にある理由を理解するには、ポインターの逆参照を考慮する必要があります。ポインタ間ポインタを逆参照する場合、最も内側のポインタが指す値にアクセスすることを表します。たとえば、次のコードを考えてみましょう。

int i = 10;
int *ptr = &i;
int **pptr = &ptr;

ここで、**pptr は *ptr と同等であり、これは単に値 i です。

ただし、次のような変換を許可するとします。 pointer-to-pointer-to-const の場合、同様の逆参照操作により定数値が得られます。これにより不整合が生じ、const ポインターの不変性が損なわれます。例:

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

ここで、s2 は const ポインターであり、他のものを指すことはできません。ただし、ps が許可されている場合は、ps を逆参照して a を取得し、a の値を変更して、禁止されている s2 が指す値を事実上変更する可能性があります。

したがって、const の整合性を維持するために、ポインターの場合、この言語では、ポインターからポインター、非 const への変換からポインターからポインター、const への変換が禁止されています。これにより、const ポインターの不変性が確実に保持され、定数値への意図しない変更が防止されます。

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

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