[C++] 宣言時のconstとポインタ変数の関係について・・・

const-pointer-e プログラミング

※当ブログでは商品・サービスのリンク先にプロモーションを含みます。ご了承ください。

宣言時の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 は型名の後ろに付くと考えると憶えやすい - Qiita
const 付きのポインタ型(C++ の参照 & も同様) const T * と T * const (T は任意の型名)はどう違うのか? というのをよく忘れて検索する羽目になっていましたが、型名…

こちらのがわかりやすいような気がします。

ポインタ変数とconstの関係、忘れないようにしたいですね。

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

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました