c-resource-mgmt

C言語の小ネタ集


Project maintained by KazKobara Hosted on GitHub Pages — Theme by mattgraham

ポインターに対する const の使い分け

必要な背景知識

ポインターに対する const の位置

以下の3通りがある。

使い分けの例

注意点

    const int32_t constant = 23;        // <--- 固定値constantを23から変更禁止にする
    int32_t*const ptr_vcc = &constant;  // <--- しかしながら、このように宣言してしまうと、*ptr_vcc 経由で書き換え可能になってしまう

上記の例ように宣言時に * の左側に const が付いていないポインター(ptr_vcc)に固定値(constant)のアドレスを入れるとコンパイル時に以下の警告が発せられるが、コンパイルは通り、固定値(constant)の値を *ptr_vss 経由で変更可能になる。

warning: initialization discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]

固定値(constant)を書き換えてはならない場合には、そのアドレスをコピーするポインター宣言時に以下のように * の左側に const を付けなければならない。

    const int32_t*const ptr_vcc = &constant; 

または、

    int32_t const*const ptr_vcc = &constant; 

挙動の確認

上記は、以下の実行環境での例ですが、環境により挙動が異なる場合がありますので、 こちらのソースを編集しコンパイルしてみるとよいと思います。

5.4.72-microsoft-standard-WSL2
gcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0

戻る