C におけるダブルポインタの const の正確性に関する警告 質問する

C におけるダブルポインタの const の正確性に関する警告 質問する

非 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

const1レベルしか追加できない理由は微妙で、次のように説明されます。comp.lang.c FAQ の質問 11.10

簡単に言えば、あなたの例に非常に関連する次の例を考えてみましょう。

const int i;
int *p;
int const **z = &p;
*z = &i;
/* Now p points to i */

C では、割り当てが最初にポイントされたレベルで修飾子を破棄することのみを許可することでこの問題を回避します (したがって、ここへの割り当てはz許可されません)。

あなたの正確な例ではこの問題は発生しません。なぜなら、const2 番目のレベルでは、 への割り当ては*z許可されないからです。C++だろうまさにこのケースでは許可されますが、C のより単純なルールでは、あなたのケースと上記の例を区別しません。

おすすめ記事