
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 *msg | char へのポインタ |
つまり、
配列を使った時点で
ポインタを使っているのと同じ状態になるのです。
文字列の正体を思い出そう
ここで、ひとつ大事な質問です。
「C言語における文字列って、そもそも何だった?」
答えは、とてもシンプルです。
| 項目 | 正体 |
|---|---|
| 文字列 | char の配列 |
つまり
- 文字列を扱う
- 配列を渡す
- 関数を作る
―このどれかをやった瞬間に
ポインタは強制参加になります。
かつてのルールと、今の私たち
以前の章では、こんな約束を設けていました。
⑥関数の引数や戻り値として、文字列や配列を直接扱わない。
これは
「まだアドレスやポインタを学んでいない段階で
意図せずトラブルに巻き込まれないため」
の安全装置でした。
ですが、今は違います。
ポインタの仕組みを理解した今なら
関数も
配列も
文字列も
すべて安心して扱えます。
まとめ:ポインタは敵ではなく、相棒
C言語において
ポインタは
避けるべき厄介者ではありません。
| 視点 | 意味 |
|---|---|
| ポインタ | メモリを直接扱うための道具 |
| C言語 | メモリを意識して制御できる言語 |
ポインタを理解すると
C言語の世界は
「怖い」から「自由」へと変わります。
ここから先は
ポインタを使いこなす側に回りましょう。
