宣言時の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の関係、忘れないようにしたいですね。

にほんブログ村に参加しております!よろしければクリックお願いします 🙂
にほんブログ村



コメント