C言語を学び始めたばかりの初心者にとって、最初の大きな壁になるのがポインター(Pointer)です。
ポインターはC言語の強力な機能の一つですが、「アドレス? 参照? * って何?」と混乱する人も多いでしょう。
そこで今回は、ポインターをわかりやすく解説し、C言語初心者でも理解できるように説明していきます!
ポインターとは?

ポインターとは、メモリのアドレス(場所)を記憶する変数です。普通の変数は「値」を保存しますが、ポインターは「アドレス」を保存します。
例えば、次のような普通の変数を考えてみましょう。
int a = 10;
この変数 a は、メモリ上のどこかに配置され、そこに「10」という値が格納されています。
しかし、C言語ではメモリの管理が重要なため、変数の「値」だけでなく、「どこに格納されているか」も知る必要があるのです。
そこで登場するのがポインターです!
ポインターの基本的な書き方

ポインターは以下のように宣言します。
int *p;
ここでの *pは「p はポインターである」ということを表しています。
pという変数は、整数型(int)のアドレスを保存するポインターという意味になります。
では、実際にポインターを使って変数のアドレスを取得し、参照する方法を見てみましょう。


このコードでは、
- &a は「変数
a
のアドレス」を取得 p = &a;
によって、ポインター p にa
のアドレスを代入*p
は「ポインター p が指しているアドレスの値」を取得
つまり、*p を使うことで、a の値(10)を間接的に取得できるのです!
なぜポインターが必要なのか?

「変数に値を直接代入できるのに、なぜポインターを使うの?」と思うかもしれません。
ポインターが便利な理由は主に次の3つです。
1.メモリを直接操作できる
メモリのアドレスを指定してデータを読み書きできるため、効率的なプログラムを作成できる。
2.関数に値を渡す際の柔軟性が増す
変数のアドレスを渡せば、関数内で元の変数を直接変更できる(参照渡し)。
3.動的メモリ管理が可能
malloc や free を使用して、プログラム実行中に必要なメモリを確保・解放できる。
ポインターを使った関数の引数渡し

ポインターの重要な使い方の一つが、関数の引数としてポインターを渡すことです。
これにより、関数内で変数の値を直接変更できます。
以下は、例のプログラムです。


このように、関数にポインターを渡すことで、関数内で変数の値を直接変更できるのです。
これは大変便利です!
ポインターの注意点(バグを防ぐために)

ポインターを使う際に注意しなければならないポイントがあります。
① 初期化されていないポインターを使用しない
ポインターは適切に初期化しておかないと、不正なメモリを指してしまい、プログラムがクラッシュする原因になります。
int *p; // 初期化されていないポインター
*p = 10; // 未定義のメモリ領域に書き込み → 危険!
正しいポインターの使用例です。

ポイント:
- ポインターを適切に初期化
int *p = &a;
とすることで、ポインター p がa
のアドレスを指すようになり、未定義のメモリにアクセスする危険がなくなる。 - 適切な変数のアドレスを代入
p に a のアドレスを代入しているため、安全に *p を使用できる。
これでポインターを正しく使えるようになります!😊
② NULLを使って安全に処理
ポインターの初期値として NULL を設定し、誤って使用しないようにしましょう。
int *p = NULL;
if (p != NULL) {
*p = 10; // NULLチェックを行う
}
③ メモリ解放を忘れない
動的に確保したメモリは、不要になったら free() を使って解放しないとメモリリーク(※1)が発生します。※1 システムのメモリ容量が減っていく現象のこと。プログラムの動作に安定性が無くなる。
int *p = (int *)malloc(sizeof(int));
*p = 20;
free(p); // メモリを解放
以下のコードは、②と③をまとめた正しいポインターの使い方です。


まとめ

ポインターは最初は難しく感じるかもしれませんが、以下のポイントを押さえれば理解しやすくなります。
✅ ポインターは「アドレスを記憶する変数」
✅ & を使ってアドレスを取得、* を使って値を取得
✅ 関数にポインターを渡すと、変数を直接変更できる
✅ 未初期化ポインターやメモリリークに注意
ポインターを理解すると、C言語の深い部分を学べるようになります。
ぜひ、実際にコードを書いて試してみてください!🚀
コメント