C++ポインタをマスター:概念、例、実践的応用
ポインタとは
C++におけるポインタとは、別の変数のメモリアドレスを格納する変数です。ポインタの型は、それが指すデータの型と一致しなければなりません。例えば、int*はintオブジェクトのアドレスのみを保持できます。
ポインタを使うと、プログラムはメモリ内のデータを直接操作でき、効率的なデータ構造、動的割り当て、参照渡しセマンティクスを実現できます。
メモリアドレスの理解
すべての変数はRAM上の一意の場所に割り当てられます。参照演算子&でそのアドレスを取得できます。変数xに対して、&xはそのメモリ位置を生成します。
ポインタ宣言の構文
宣言は以下のパターンに従います:
datatype *pointer_name;
- datatype – ポインタが参照するデータの基本型
- pointer_name – ポインタ変数の識別子
- アスタリスクがこの変数がポインタであることを示す
例:
int *p; // intへのポインタ double *d; // doubleへのポインタ char *c; // charへのポインタ
参照(&)と間接参照(*)
&演算子は変数のアドレスを与え、*演算子はそのアドレスに格納されている値を取得します。
#include <iostream>
using namespace std;
int main() {
int x = 27;
int *ip = &x;
cout << "Value of x: " << x << endl;
cout << "Address of x: " << ip << endl;
cout << "Value via pointer: " << *ip << endl;
return 0;
}
出力:
Value of x: 27 Address of x: 0x7ffeefbff5ac Value via pointer: 27
ポインタと配列
配列名は最初の要素へのポインタに変換されます。したがって:
int arr[5]; int *p = arr; // 正しい int *q = &arr; // 間違い – &arrは配列全体のアドレスであり、最初の要素ではない
ポインタを使った配列のイテレーション:
#include <iostream>
using namespace std;
int main() {
int *p;
int arr[] = {10, 34, 13, 76, 5, 46};
p = arr;
for (int i = 0; i < 6; ++i) {
cout << *p++ << endl;
}
return 0;
}
出力:
10 34 13 76 5 46
ヌルポインタ
有効なターゲットを持たないポインタは、NULL(またはC++11以降ではnullptr)で初期化すべきです。これにより誤った間接参照を防止できます。
#include <iostream>
using namespace std;
int main() {
int *ip = nullptr;
cout << "ip = " << ip << endl; // 0と表示
return 0;
}
関数でのポインタ使用
関数にポインタを渡すと、関数は元の変数を変更できます。この技法で参照渡しを実装します。
#include <iostream>
using namespace std;
void modify(int *p1, int *p2) {
*p1 = 10;
*p2 = 11;
}
int main() {
int a = 5, b = 5;
cout << "Before: a=" << a << ", b=" << b << endl;
modify(&a, &b);
cout << "After: a=" << a << ", b=" << b << endl;
return 0;
}
出力:
Before: a=5, b=5 After: a=10, b=11
ポインタの利点
- ハイパフォーマンスコードのための直接メモリアクセス
- 単一の関数呼び出しで複数の変数を変更可能
- 動的メモリ割り当てと解放(
new/delete) - 連結リスト、ツリー、グラフなど複雑なデータ構造の基盤
- オブジェクト指向設計での効率的なリソース共有と多態性を促進
クイックサマリー
- ポインタは別の変数のアドレスを格納
- アドレス取得に
&、間接参照に*を使用 - 配列名は最初の要素へのポインタに変換される
- 未使用ポインタは
nullptrで初期化 - 関数にポインタを渡してインプレース変更を実現
- ポインタは動的メモリ管理と効率的なデータ構造を可能にする
C言語
- C++配列を徹底解説:宣言、初期化、ポインタ活用テクニック
- C++ do-while文:構文、実践例、ネストしたループ
- C++ポインタをマスター:概念、例、実践的応用
- C++ char型をマスター:宣言、ASCII、変換テクニック
- C++演算子オーバーロード:コード例付き実践ガイド
- C++構造体を実例で徹底解説
- C++のstd::listをマスターする:構文、関数、実践例
- C++関数を実例で徹底解説:基本から応用まで
- C#コレクション実践チュートリアル:実例で学ぶ柔軟なデータ管理
- C 言語ポインタ完全ガイド: 型、使い方、ベストプラクティス
- C言語ポインタ完全マスター:実践的ステップで上級プログラミングへ