第15回|配列とポインタが、同じ景色に見える瞬間

当サイトでは、コンテンツの一部に広告を掲載しています。
配列とポインタが、同じ景色に見える瞬間

はじめてのC言語 | 第15回

目次

配列とポインタは、どこでつながるのか

C言語では、配列や文字列を扱うとき、
「場所(ロケーション)」という考え方が、何度も顔を出します。

配列は「並んだ箱」。
ポインタは「箱の場所を指す札」。

最初は、まったく別の道具のように見えるこの2つですが、
あるところから、同じ景色を見ていることに気づきます。

この回では、その瞬間を、ゆっくり確認していきましょう。

配列の正体は「先頭の場所」から始まる

まずは、配列を思い出します。

int a[4] = {10, 20, 30, 40};

これは、

  • 箱が4つ、横に並び
  • 左から順に値が入っている

状態でした。

イメージすると、こんな並びです。

+----+----+----+----+
| 10 | 20 | 30 | 40 |
+----+----+----+----+

ここで、ひとつ大切なポイントがあります。

配列名 a の正体

配列名 a は、
箱4つすべてを「持ち歩いている」わけではありません。

実体としては、
箱4つ分の場所(メモリ)を確保しています。

しかし、プログラムの中で名前 a を使うとき、
a はこう振る舞います。

「私は、ここ(先頭)から始まっていますよ」

つまり配列名は、並びの入口を示す看板(アドレス)として使われるのです。

カフェのバックヤードで言えば、

  • 棚そのものではなく
  • この棚は、ここから始まっています

という札を指し示している状態です。

「1つ右へ進む」という感覚

配列が「並んだ箱」だとすると、
そこには自然な流れがあります。

  • 先頭
  • その右
  • さらに右

ポインタを使うと、この流れをそのまま表現できます。

int *p = a;

これは、

  • 配列の先頭の場所を
  • ポインタ p が指している

という意味です。

ここで、

p++;

と書くと、

  • 値が増えるのではなく
  • 指している場所が、ひとつ右へ進む

という動きになります。

箱は動いていません。
動いているのは、ロケーション札(p)だけです。

配列で見ていた景色

配列では、こんな書き方をしていました。

a[0]
a[1]
a[2]

これは、

  • 先頭の箱
  • その次の箱
  • さらに次の箱

を、番号で指定して見ています。

配列は、「何番目の箱か」という視点で世界を見ています。

ポインタで見ていた景色

一方、ポインタではこう書きます。

*p
*(p + 1)
*(p + 2)

こちらは、

  • 今いる場所
  • そこから1つ右
  • さらに1つ右

と、場所をたどって見ています。

番号は出てきません。
あるのは、「今どこにいるか」という感覚だけです。

同じ場所を、違う言葉で見ていただけ

ここで、ひとつの気づきが生まれます。

a[1]

*(p + 1)

この2つは、同じ箱を指しています。

見ている世界は同じ。
違うのは、見方だけです。

  • 配列:番号で見る
  • ポインタ:場所から進んで見る

別々の道具に見えていたものが、
実は 同じ並び、同じ箱 を指していました。

これが、「配列とポインタが、同じ景色に見える瞬間」です。

なぜ、別々のものに見えてしまうのか

初心者のころは、

  • 配列は [ ]
  • ポインタは * や +

と、記号がまったく違って見えます。

そのため、「配列とポインタは別の仕組みだ」と感じてしまいます。

でも、裏側ではずっと同じことをしています。

  • 連続した場所が並び
  • 先頭を基準に
  • どれだけ進むか

この世界を、

  • 配列は「番号」で
  • ポインタは「移動」で

表現していただけでした。

文字列でも、同じ景色を見る

文字列も、本質は同じです。

char s[] = "ABC";

中身は、

'A' 'B' 'C' '\0'

という、並んだ箱です。

だから、こんなコードが自然に書けます。

char *p = s;

while (*p != '\0') {
    p++;
}

これは、

  • 先頭の場所から始めて
  • ひとつずつ右へ進み
  • 終わりの印(\0)まで歩く

という処理です。

配列を番号で見るか、ポインタで歩くか。

やっていることは、同じです。

この感覚があると、何が変わるか

この「同じ景色」が見えるようになると、

  • for文の意味が見える
  • 文字列操作の理由が分かる
  • 関数に配列を渡す意味が分かる
  • 「なぜ危険なのか」を予測できる

ようになります。

C言語が、記号の集まりではなく、場所を扱う言葉に見えてきます。

まとめ

  • 配列とポインタは、別々の道具
  • でも、同じ世界を指している
  • 配列は「番号で見る」
  • ポインタは「場所からたどる」
  • 見方が違うだけで、景色は同じ

このことに気づいたとき、C言語の中が、少し静かに整理されます。

次は、「なぜ配列を関数に渡すと、姿が変わるのか」
その不思議を、同じ景色から見ていきましょう ☕

さらに学びたいあなたへ

📘 用途ごとに選ぶ Linux のおすすめ本

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

のいのアバター のい UNIX Cafe 編集部

UNIX Cafe は、むずかしい言葉をできるだけ使わず、物語を読むような気持ちで気軽に学べる場所です。
プログラミングは、アイデアをコンピューターに伝えるための「ことば」。
簡単な単語と文法を覚えることで、誰でもターミナルから便利なコマンドを使えるようになります。
コーヒーを片手に立ち寄るような気持ちで、やさしいプログラミングの世界を、
そっとのぞいてみてください。

目次