1. 導入:なぜポインタを固定する必要があるのか?
C++において、ポインタは非常に強力ですが、誤って指し先を変えてしまうと予期せぬバグを引き起こす原因になります。特に、関数に渡すポインタや特定のメモリ領域を指し続ける必要がある場合、「ポインタそのものの値(アドレス)」を固定したいという場面があります。ここで役立つのがconstポインタ(T const)です。これを使うことで、「このポインタは一度指し示したら、別の場所を指すことはできない」という制約をコンパイラに強制させ、安全性を高めることができます。
2. 基礎知識:constの位置による違い
C++のポインタにおけるconstには、大きく分けて「指し先の内容を保護する」ものと「ポインタそのものを保護する」ものの2種類があります。
混同しやすいので、以下の違いを覚えておきましょう。
・const T p:ポインタが指している「値」が変更不可(読み取り専用)。
・T const p:ポインタが保持している「アドレス」が変更不可(再代入不可)。
今回解説する T const は、後者の「ポインタの住所を固定する」という役割です。
3. 実装と解決策
T const を宣言する際は、型名の後にconstを配置します。これにより、初期化時に指定したアドレス以外を指すことができなくなります。もしプログラムの途中で p = &y; のような再代入を行おうとすると、コンパイルエラーが発生するため、意図しないアドレスの書き換えを未然に防ぐことが可能です。
4. サンプルプログラム
以下のコードは、T constの動作をシミュレートしたものです。
#include
int main() {
int x = 10;
int y = 20;
// ポインタpをxのアドレスで固定する
// これ以降、pに他のアドレスを代入しようとするとエラーになる
int const p = &x;
// ポインタの指す先の内容を変更するのはOK
p = 100;
std::cout << "xの値: " << p << std::endl;
// 以下の行のコメントアウトを外すとコンパイルエラーになります
// p = &y; // エラー: pはconstポインタのため再代入不可
return 0;
}
5. 応用・注意点
現場での開発において、T const は特に関数の引数として活用されます。例えば、メモリマップドI/Oのように「特定のハードウェアレジスタを指すポインタ」を扱う際、誤ってポインタの指し先をずらしてプログラムが暴走するのを防ぐために非常に有効です。
注意点として、const T const p と記述すると、「指し先の内容も、ポインタのアドレスも両方変更不可」というより強力な保護をかけることも可能です。状況に応じて、どの範囲を保護したいのかを見極めて使い分けるのが、熟練したC++エンジニアへの第一歩です。

コメント