C言語の最初の壁になるポインターについて!初心者向けに簡単に解説!

プログラム言語

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

そこで今回は、ポインターをわかりやすく解説し、C言語初心者でも理解できるように説明していきます!

ポインターとは?

DSC_0478

ポインターとは、メモリのアドレス(場所)を記憶する変数です。普通の変数は「値」を保存しますが、ポインターは「アドレス」を保存します。

例えば、次のような普通の変数を考えてみましょう。
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; // 未定義のメモリ領域に書き込み → 危険!

正しいポインターの使用例です。

ポインターの初期化あ

ポイント:

  1. ポインターを適切に初期化
    int *p = &a; とすることで、ポインター p が a のアドレスを指すようになり、未定義のメモリにアクセスする危険がなくなる。
  2. 適切な変数のアドレスを代入
    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言語の深い部分を学べるようになります。
ぜひ、実際にコードを書いて試してみてください!🚀

コメント

タイトルとURLをコピーしました