C言語でプログラミングを始めると、必ず登場するのが「ポインタ」です。ポインタはC言語の強力な特徴であり、メモリ操作や効率的なプログラム作成に欠かせません。しかし、その概念や使い方に苦手意識を持つ方も多いでしょう。この記事では、ポインタの基礎から制御方法、応用例までを図解・サンプルコード付きで丁寧に解説します。
ポインタとは?
**ポインタとは、「変数のアドレス(メモリ上の位置)を格納する変数」**です。
通常の変数は値そのものを保持しますが、ポインタは「どこに値があるか」を記憶します。
int x = 10;
int *p;
p = &x; // xのアドレスをpに代入
このとき、p
は「xが保存されているメモリの番地」を記憶します。*p
と書くことで、そのアドレスに格納された値(この場合は10)を参照できます。
ポインタの簡単なイメージは↓のような感じです。

ポインタの宣言と基本操作
宣言方法
- *型名 変数名;
例:int *ptr;
(int型の値を指すポインタ)
アドレスの取得
- &演算子で変数のアドレスを取得
ptr = &x; /* xのアドレスをptrに代入 */
間接参照(値の取得・書き換え)
- *演算子でアドレス先の値を参照・変更
*ptr = 20; // xの値が20に書き換わる
配列とポインタの関係
C言語では配列名は配列の先頭要素のアドレスとして扱われます。
int arr[] = {1, 2, 3};
int *p = arr; // arrはarr[0]のアドレス
printf("%d\n", *p); // 1
printf("%d\n", *(p+1)); // 2
arr[k]
は*(arr + k)
と同じ意味です。
ポインタの演算
ポインタには加算・減算が可能です。p++
で「次の要素のアドレス」へ移動します(型に応じたサイズ分アドレスが進む)。
int arr[] = {10, 20, 30};
int *p = arr;
printf("%d\n", *p); // 10
p++;
printf("%d\n", *p); // 20
関数とポインタ(参照渡し)
C言語の関数は値渡しが基本ですが、ポインタを使うことで参照渡しが可能です。
これにより、関数内で変数の値を直接変更できます。
void updateValue(int *p) {
*p = 100;
}
int main() {
int num = 50;
updateValue(&num);
printf("%d\n", num); // 100
return 0;
}
このように、関数に変数のアドレスを渡すことで、呼び出し元の値を直接操作できます。
応用:関数ポインタ
関数のアドレスもポインタで扱うことができます。
これにより、関数を引数として渡したり、動的に処理を切り替えたりできます。
int add(int a, int b) { return a + b; }
int (*func_ptr)(int, int) = add;
int result = func_ptr(2, 3); // 5
ポインタ制御の注意点
- 未初期化ポインタの利用は危険(ダングリングポインタやセグメンテーションフォルトの原因)
- NULLポインタの活用(初期化時やエラー判定に利用)
- **多重ポインタ(二重ポインタ)**はポインタ配列や動的メモリ管理でよく使われる
まとめ
- ポインタは変数のアドレスを格納する変数
- 配列・関数・構造体などと組み合わせて使うことで、C言語の表現力が飛躍的に向上
- 参照渡し・ポインタ演算・関数ポインタなどを活用し、効率的なプログラミングを実現
C言語を扱うのには、このポインタの仕組みを理解しておくことがマストになります。
メモリ空間にどのように変数等が配置されるのか正しく理解してC言語マスターになりましょう!!
コメント