const指定子とポインタ
変数の宣言にconst指定子をつけると、以降値を変更できないことは定数で既に学習しました。
これだけ見ると簡単ですが、このconstにポインタを絡めて考えると少し複雑になります。
しっかり読んで理解しましょう。
尚、このページではint型を例に挙げて説明しますが、基本的には他の型でも扱いは同じです。
const int型のポインタ
const int a;
const int *pa;
と書くとこれは「const int型の変数aへのポインタpa」を宣言したことになります。
この場合constが付き、変更が不可能なのは変数aとなります。
ポインタpaがconstに見えますが、こちらは変更可能です。
まとめると以下のようになります。
| データ | 変更 |
| a | × |
| pa | 〇 |
| &a | × |
| *pa | × |
int型のconstなポインタ
int b;
int *const pb;
と書くとこれは「int型の変数bへのconstなポインタpb」となります。
すなわち、初期化したpbは、以降値の変更ができなくなるということです。
bには何も制限がないので、一般の変数として扱うことができます。
まとめると以下のようになります。
| データ | 変更 |
| b | 〇 |
| pb | × |
| &b | 〇 |
| *pb | 〇 |
constとポインタのまとめ
const指定子とポインタの関係性は理解できたでしょうか。
これらの関係は重複することができます。
つまり、
const int c;
const int *const pc;
と書くとこれは「const int型の変数cへのconstなポインタpc」を宣言していることになります。
まとめると以下のようになります。
| データ | 変更 |
| c | × |
| pc | × |
| &c | × |
| *pc | × |
constは「変化することのない値」を保持する時に効果を発揮します。
使いどころとポインタとの兼ね合いを考え適切に使いこなしましょう。