- blogs:
- cles::blog

const int *p と int * const p の違い

c言語の const キーワードを調べていて、const の微妙な位置によって意味が変わるということが分かったのでメモ。
† まずは 「const int *p」
始めに試してみるのは一般的に使われている const int *p の方。gcc のメッセージの「読み取り専用位置(read-only location)」が表しているとおり、こちらはポインタの指す先が const と見なされるので、間接参照演算子を使って値を変更できなくなります。文字列などでポインタ渡ししかできないけれども、副作用は困るという場合に使うやつですね。
† マイナーな 「int * const p」の意味は・・・
const は先頭につけるものと覚えている人も多いと思いますが、実は const は int * const p と名前の直前につけることもできます。このようにすると gcc のエラーが「読み取り専用パラメータ(read-only parameter)への代入」に変化します。この場合はパラーメータが const になるということで、参照先自体は書き換えることができます。
仮引数に対する const はパラメーターの書き換えを禁止できるものの、このポインタを介した副作用は防ぐことができないため、プログラミング的にあまり大きな意味を持ちません。ただ、静的解析ツールの中にはパラメータへの代入を検出対象にしている場合もあるので、コードの品質向上という意味ではうまく使うと役立つかもしれません。僕は java でもパラメータには final つけたい方なので積極的に使っていこうと思います。
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/8089
古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。
2 . Windows 10 で勝手にログアウトされないようにする(31158)
3 . Word で数式がグレーアウトされていて挿入できないときは(26616)
4 . リモートデスクトップで Alt + PrtSc と同じことをするには(22075)
5 . Visual Studio 2017/2019 で scanf() がエラー(C4996)になるときは(21380)