C++ポインタ完全ガイド:仕組みと実践例
C++ポインタ
このチュートリアルでは、C++ポインタの仕組みと実践例を通じて、この重要な言語機能をマスターできるよう解説します。
C++において、ポインタは別の変数のメモリアドレスを保持する変数です。ポインタにより直接的なメモリ操作、動的確保、効率的なデータ処理が可能になります。
C++におけるアドレス
変数varが与えられたとき、式&varはそのメモリ内のアドレスを返します。例えば:
例1: C++での変数アドレスの表示
#include <iostream>
using namespace std;
int main() {
// 変数を宣言
int var1 = 3;
int var2 = 24;
int var3 = 17;
// var1のアドレスを表示
cout << "var1のアドレス: " << &var1 << endl;
// var2のアドレスを表示
cout << "var2のアドレス: " << &var2 << endl;
// var3のアドレスを表示
cout << "var3のアドレス: " << &var3 << endl;
}
出力
var1のアドレス: 0x7fff5fbff8ac var2のアドレス: 0x7fff5fbff8a8 var3のアドレス: 0x7fff5fbff8a4
アドレスは16進数形式で表示されます。連続するアドレス間の4バイトの差は、64ビットシステムでのintの4バイトサイズを反映しています。
注意: 正確なアドレスはプログラム実行ごとに異なる場合があります。
C++ポインタ
前述の通り、ポインタは直接値ではなくアドレスを格納します。ポインタの宣言は簡単です:
int *pointVar;
ここで、pointVarはintへのポインタです。推奨される構文ではアスタリスクを型の隣に置きます:
int* pointVar; // 推奨構文
複数宣言も可能です:
int* pointVar, p;
この行では、pointVarはポインタですが、pは通常のintです。アスタリスクは型ではなく変数名に結合します。
ヒント: *演算子はポインタ宣言に使われ、乗算には使われません。
ポインタへのアドレス代入
ポインタを変数のアドレスに結びつけるには、アドレス演算子&を使います:
int* pointVar, var;
var = 5;
// varのアドレスをpointVarポインタに代入
pointVar = &var;
これでpointVarはvarのメモリアドレスを保持します。
ポインタを使ってアドレスから値を取得
間接参照演算子*は、ポインタが保持するアドレスに格納された値を取得します:
int* pointVar, var;
var = 5;
pointVar = &var;
cout << *pointVar << endl; // 出力: 5
ここで、*pointVarはvarの値(5)を生成します。この演算子は間接参照演算子と呼ばれます。
注意: C++では、pointVar(ポインタ)と*pointVar(指し先の値)は別のものです。
例2: C++ポインタの動作
#include <iostream>
using namespace std;
int main() {
int var = 5;
// ポインタ変数を宣言
int* pointVar;
// varのアドレスを格納
pointVar = &var;
// varの値を表示
cout << "var = " << var << endl;
// varのアドレスを表示
cout << "varのアドレス (&var) = " << &var << endl << endl;
// ポインタpointVarを表示
cout << "pointVar = " << pointVar << endl;
// pointVarが指すアドレスの内容を表示
cout << "pointVarが指すアドレスの内容 (*pointVar) = " << *pointVar << endl;
return 0;
}
出力
var = 5 varのアドレス (&var) = 0x61ff08 pointVar = 0x61ff08 pointVarが指すアドレスの内容 (*pointVar) = 5
ポインタが指す値の変更
pointVarがvarを指している場合、*pointVarを変更すると元の変数も変わります:
int var = 5;
int* pointVar;
pointVar = &var;
*pointVar = 1;
cout << var << endl; // 出力: 1
pointVarと&varは同じアドレスを保持するため、間接参照値を変更するとvarが更新されます。
例3: ポインタによる値の変更
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar;
// varのアドレスを格納
pointVar = &var;
// varを表示
cout << "var = " << var << endl;
// *pointVarを表示
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "varの値を7に変更:" << endl;
// varの値を7に変更
var = 7;
cout << "var = " << var << endl;
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "*pointVarの値を16に変更:" << endl;
// *pointVarを通じてvarの値を16に変更
*pointVar = 16;
cout << "var = " << var << endl;
cout << "*pointVar = " << *pointVar << endl;
return 0;
}
出力
var = 5 *pointVar = 5 varの値を7に変更: var = 7 *pointVar = 7 *pointVarの値を16に変更: var = 16 *pointVar = 16
ポインタ操作でのよくある間違い
以下は典型的なエラーと正しい扱い方です:
int var, *varPoint;
// 間違い!varPointはアドレスだがvarは値
varPoint = var;
// 間違い!
// &varはアドレス
// *varPointは&varに格納された値
*varPoint = &var;
// 正しい!
// varPointはアドレス、&varもアドレス
varPoint = &var;
// 正しい!
// *pointVarとvarは両方とも値
*varPoint = var;
推奨リーディング:
- voidポインタを使った汎用データ型ポインタの扱い方
- 配列をポインタで表現する方法
- 関数でポインタを使う方法
- 構造体でポインタを使う方法

C言語
- C++データ型完全ガイド:基本型、修飾子、ベストプラクティス
- C++演算子完全ガイド:算術・代入・関係・論理・ビット演算子と実例
- C++コメント完全ガイド:読みやすく保守しやすいコードのためのベストプラクティス
- C++クラステンプレート完全ガイド:実践的なジェネリックプログラミング
- C言語ポインタ完全マスター: 実践的エキスパートガイド
- C++ポインタをマスター:概念、例、実践的応用
- C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ
- C++プログラミング言語:概要と主要機能
- C++定数とリテラル完全解説:型、構文、ベストプラクティス
- C++演算子完全ガイド:種類、使い方、ベストプラクティス
- C++数値型完全ガイド:実践的な使い方と数学関数