C言語入門|Cがポインタを必須とする理由

No Pointer, No Life.

「ポインタの書き方も、だいたい意味もわかった。
でも正直なところ、もうここから先は
“ポインタを使わない普通のプログラミング”でいいかな……」

―はい、ここまで来ると、誰もが一度はそう思います。
安心してください。その感覚は、とても自然です。

たとえば車で言えば
「自分はオートマで十分。クラッチ操作なんて使わないし学ばない」
という選択とよく似ています。
日常生活でドリフト走行が必要になることは、まずありませんからね。

でも、C言語では話が違います。

C言語において
「高級な機能だけを使って、ポインタは学ばない」
という選択肢は、残念ながら存在しません。

なぜなら、C言語の設計そのものが
ポインタを使う前提で成り立っている言語だからです。

ポインタは避けられない理由①

標準関数を使うだけでポインタが必要になる

C言語には、私たちのプログラミングを助けてくれる
便利な標準関数がたくさん用意されています。

たとえば次のような関数です。

関数名役割
printf画面に文字や数値を表示する。
scanfキーボードから入力を受け取る。
strlen文字列の長さを調べる。
fgets文字列をまとめて読み込む。

この中でも、特に scanf や fgets は
引数としてポインタを必ず使う関数です。

なぜポインタが必要なのか?

入力処理では
「関数の中で取得した値を、呼び出し元に反映させる」
必要があります。

そのため、
値そのものではなく
値が格納されている場所(アドレス)を渡す必要があるのです。

サンプルプログラム

プロジェクト名:10-1-1 ソースファイル名: sample10-1-1.c

#include <stdio.h>

int main(void) {
    int score;

    printf("点数を入力してください: ");
    scanf("%d", &score);

    printf("あなたの点数は %d 点です\n", score);

    return 0;
}

登場する命令の解説

命令役割
printf画面に文字列や数値を表示する。
scanf標準入力から値を読み取る。
&演算子変数のアドレスを取得する。

ここで重要なのが &score です。

表現意味
score変数に入っている値
&score変数 score が置かれているメモリの場所

scanf は
「入力された値を、この場所に書き込んでください」
という仕組みで動いています。

つまり、
標準関数を普通に使うだけで、ポインタは避けられない
というわけです。

ポインタは避けられない理由②

配列を関数に渡した瞬間、ポインタになる

実用的なプログラムでは
main 関数だけですべてを書くことは、まずありません。

多くの場合、処理を関数に分けて
引数や戻り値でデータをやり取りします。

その中でも特に重要なのが
配列を関数に渡すケースです。

配列を渡すと、内部ではどうなる?

次のような関数を考えてみましょう。

void showMessage(char msg[]) {
    printf("%s\n", msg);
}

一見すると
「char 配列を受け取っている」
ように見えますが、実際には違います。

C言語では、
配列を引数に指定すると、自動的にポインタに変換される
という特別なルールがあります。

配列とポインタの正体

書き方実体
char msg[]char へのポインタ
char *msgchar へのポインタ

つまり、
配列を使った時点で
ポインタを使っているのと同じ状態になるのです。

文字列の正体を思い出そう

ここで、ひとつ大事な質問です。

「C言語における文字列って、そもそも何だった?」

答えは、とてもシンプルです。

項目正体
文字列char の配列

つまり

  • 文字列を扱う
  • 配列を渡す
  • 関数を作る

―このどれかをやった瞬間に
ポインタは強制参加になります。

かつてのルールと、今の私たち

以前の章では、こんな約束を設けていました。

⑥関数の引数や戻り値として、文字列や配列を直接扱わない。

これは
「まだアドレスやポインタを学んでいない段階で
意図せずトラブルに巻き込まれないため」
の安全装置でした。

ですが、今は違います。

ポインタの仕組みを理解した今なら
関数も
配列も
文字列も
すべて安心して扱えます。

まとめ:ポインタは敵ではなく、相棒

C言語において
ポインタは
避けるべき厄介者ではありません。

視点意味
ポインタメモリを直接扱うための道具
C言語メモリを意識して制御できる言語

ポインタを理解すると
C言語の世界は
「怖い」から「自由」へと変わります。

ここから先は
ポインタを使いこなす側に回りましょう。