非 const データへのポインターは、同じ型の const データへのポインターに暗黙的に変換できます。
int *x = NULL;
int const *y = x;
追加の間接参照に一致するように追加の const 修飾子を追加すると、論理的には同じように動作するはずです。
int * *x = NULL;
int *const *y = x; /* okay */
int const *const *z = y; /* warning */
ただし、フラグを使用して GCC または Clang でこれをコンパイルすると-Wall
、次の警告が表示されます。
test.c:4:23: warning: initializing 'int const *const *' with an expression of type
'int *const *' discards qualifiers in nested pointer types
int const *const *z = y; /* warning */
^ ~
const
追加の修飾子を追加すると、「ネストされたポインター型の修飾子が破棄される」のはなぜですか?
ベストアンサー1
const
1レベルしか追加できない理由は微妙で、次のように説明されます。comp.lang.c FAQ の質問 11.10。
簡単に言えば、あなたの例に非常に関連する次の例を考えてみましょう。
const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */
C では、割り当てが最初にポイントされたレベルで修飾子を破棄することのみを許可することでこの問題を回避します (したがって、ここへの割り当てはz
許可されません)。
あなたの正確な例ではこの問題は発生しません。なぜなら、const
2 番目のレベルでは、 への割り当ては*z
許可されないからです。C++だろうまさにこのケースでは許可されますが、C のより単純なルールでは、あなたのケースと上記の例を区別しません。