1篇の文章はc言語の定数とポインタのいくつかの配列の組み合わせを理解します


これも古典的な面接問題です.多くの人が悩んでいて、多くの人が分からないことに気づきました.
ここではまずいくつかの結論を述べ,後で詳しく検証している.
  • const intとint constは同じです.コンパイラはint constタイプ
  • とみなす
  • アスタリスク、およびアスタリスクの後の内容は、右側の変数
  • のみを修飾します.
    だから簡単だ
  • int定数を指すポインタconst int*a,int const*aは、いずれも正しい
  • である.
  • intを指す定数ポインタint*const a
  • int定数を指す定数ポインタconst int*const aまたはint const*const a
  • 次はコード分析です.
    私は簡単なコードを書いて、いくつかの組み合わせを並べて、コンパイルエラーと警告を表示して、興味のある友达は見てもいいです.間違ったところはすべて注釈されて、もし自分で再現したいならば、自分で注釈を取り除いてそれからコンパイルすることができて、私はclangを使って、コンパイルの間違いは比較的に友好的で、gccを使うならば、間違いは異なっています.
    int main(int argc, char *argv[])
    {
        
        int i = 0;
        int j = 0;
        const int a = 1, a1 = 2 ;
        int const b = 1, b1 = 2 ;
        const int * const const_int_ptr_const = &i;
        const int * const_int_ptr = &i
            , const_int = &i; //compile warning: incompatible pointer to integer conversion initializing 'const int' with an expression of type 'int *'
        int const * int_const_ptr = &i
            , int_const = &i; //compile warning: incompatible pointer to integer conversion initializing 'const int' with an expression of type 'int *'
    //    const * int const_ptr_int = &i; //compile error
        int * const int_ptr_const = &i
            , int_ptr = &i; //compile warning: incompatible pointer to integer conversion initializing 'int' with an expression of type 'int *'
    //    * int const ptr_int_const = &i; //compile error
    //    * const int ptr_const_int = &i; //compile error
    
    //    a = 2; //compile error: cannot assign to variable 'a' with const-qualified type 'const int'
    //    a1 = 3;//compile error: cannot assign to variable 'a' with const-qualified type 'const int'
    //    b = 4;//compile error: cannot assign to variable 'a' with const-qualified type 'const int'
    //    b1 = 5;//compile error: cannot assign to variable 'a' with const-qualified type 'const int'
    
    
    //    *const_int_ptr = 4; //compile error:read-only variable is not assignable
    //    *int_const_ptr = 5; //compile error:read-only variable is not assignable
        *int_ptr_const = 6;
    //    *const_int = 7; //compile error: indirection requires pointer operand ('int' invalid)
    //    *int_const = 8; //compile error: indirection requires pointer operand ('int' invalid)
    //    *int_ptr = 9;  //compile error: indirection requires pointer operand ('int' invalid)
    //    *const_int_ptr_const = 10; //compile error: read-only variable is not assignable
    
        const_int_ptr = &j;
        int_const_ptr = &j;
    //    const_int_ptr_const = &j; //compile error: cannot assign to variable 'const_int_ptr_const' with const-qualified type 'const int *const'
    
    //    int_ptr_const = &j; //compile error: cannot assign to variable 'int_ptr_const' with const-qualified type 'int *const'
    
        return 0;
    }