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
C言語を扱うのには、このポインタの仕組みを理解しておくことがマストになります。
メモリ空間にどのように変数等が配置されるのか正しく理解してC言語マスターになりましょう!!