宣言時のconst
とポインタ変数の関係は結構複雑です。
const
と*
の位置関係ではなく、もっとロジカルに覚えられるように、まとめておきます。
constとは
定数を表現するための修飾子になります。
const
で宣言した変数の値を書き換えることは基本的にできません。
なので、書き換えできない変数デスヨっていうことを示したいときに使ったりします。
const int nextYear = 2023
ポインタ変数とは
過去にまとめた記事があるのでこちらをご覧ください。
ポインタ変数とは、メモリアドレスを保持する変数ですね。
constとポインタ変数
ポインタ変数もconst
宣言することができるのですが、実は結構複雑です。
*
の位置がconst
の前後にある場合で意味が変わってくるのです・・・!
*
がconst
の前にある場合と後ろにある場合で分けようかと思いましたが、これがなかなか覚えられないので別の切り口で分けてみます。
*
とconst
の位置関係によって、(A)オブジェクトが不変、(B)メモリアドレスが不変、(C)オブジェクト・メモリアドレスが不変と3つの変数を定義することができます。
(A) オブジェクトが不変
オブジェクトが不変ということは、型にconst
がかかればよいので、int const *num
と書くことができます。
int num = 123;
int const *num = #
*num = 456; // NO
num = NULL; // OK
こちらでは、ポインタ変数が保持しているオブジェクトを変更することができません。オブジェクトが不変になります。
一方で、メモリアドレスは変更可能なので、NULL
ポインタが指定できます。
(B) メモリアドレスが不変
メモリアドレスが不変ということは、ポインタにconst
がかかればよいので、int *const num
と書くことができます。
int num = 123;
int *const num = #
*num = 456; // OK
num = NULL; // NO
先ほどとは逆の動作ですね。
(C) オブジェクト・メモリアドレスが不変
オブジェクト・メモリアドレスが不変ということは、型とポインタにconst
がかかればよいので、int const *const num
と書くことができます。
int num = 123;
int const* const num = #
*num = 456; // NO
num = NULL; // NO
まとめ
*
とconst
の位置関係で最初は覚えようと思ったのですが、ややこしいので以下の記事を参考にまとめてみました。
こちらのがわかりやすいような気がします。
ポインタ変数とconst
の関係、忘れないようにしたいですね。
にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村
コメント