ポインタでメモリを自在に操る!C言語の「ポインタ演算」をやさしく解説
C言語では、ポインタを使ってメモリ上のデータを直接操作できます。
さらに、ポインタ同士での加減算や比較といった「ポインタ演算」も可能です。
配列処理やデータの効率的なアクセスに欠かせないテクニックです。
ポインタ演算とは?
ポインタ演算とは、ポインタの値(アドレス)を使って加算・減算・比較などを行うことです。
特に配列と組み合わせると、添字なしでアクセスできたりします。
ポインタの加算・減算
ポインタに数値を足すと、その分だけ次の要素のメモリアドレスに進みます。
int nums[] = {10, 20, 30};
int *p = nums;
printf("%d\n", *p); // 10
printf("%d\n", *(p+1)); // 20
printf("%d\n", *(p+2)); // 30
p + 1
は 次のint型(4バイト)
へ移動
p - 1
は 1つ前のint型
へ戻る
配列アクセスとポインタ演算の関係
int a[] = {1, 2, 3};
int *p = a;
a[1] == *(a + 1);
p[2] == *(p + 2);
*(p + i) == p[i]; // 完全に同じ意味!
ポインタは、配列のインデックス操作と同じように使えます。
ポインタの比較
int nums[] = {5, 10, 15};
int *p1 = &nums[0];
int *p2 = &nums[2];
if (p1 < p2) {
printf("p1はp2より前の要素を指している\n");
}
同じ配列内であれば、ポインタ同士の比較も可能です。
注意点
- 型に応じて進むアドレスの幅が変わる(例:intなら4バイト単位)
- 無効なアドレスにアクセスしないよう注意(未定義領域)
- 違う配列間での比較や演算は危険
まとめ
ポインタ演算とは、ポインタを使ってメモリ上の位置を計算・操作するテクニックです。
配列との相性が非常によく、p + 1
や p[i]
のような書き方で効率よくデータにアクセスできます。
初心者の方は、配列 × ポインタの組み合わせから練習してみましょう!