C言語の小ネタ集
以下の3通りがある。
* の左右両側に const を付ける
*ptr が指す値を変更する予定は無く、ptr が指すアドレスも変更する予定が無い場合
// 例 二つの例の挙動は同じ
const uint32_t * const ptr;
uint32_t const * const ptr;
* の右側のみに const を付ける
*ptr が指す値を変更する予定はあるが、ptr が指すアドレスは変更する予定が無い場合
// 例
uint32_t * const ptr;
* の左側のみに const を付ける
*ptr が指す値を変更する予定は無いが、ptr が指すアドレスは変更する予定がある場合
// 例 二つの例の挙動は同じ
const uint32_t * ptr;
uint32_t const * ptr;
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