わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

配列とポインタの違いを,「家」を使って説明してみる

今日もプログラミングの授業です.前々回に配列,前回にポインタを取り上げましたが,授業中のアンケートを見る限り,学生が正しく理解してくれたとは言い難い状況です.
こういうときは,たとえ話を考えてみよう…ということで思いついたのが,「家」,正確には「マンション」です.

  • 配列変数は要素数に応じたオブジェクトを作るが,ポインタ変数は参照先しか作らない.
    • 配列変数が作るのは「マンション」です.同じつくりの居室を,指定した数だけ作ります.
    • 一方,ポインタ変数が作るのは,その中の住人です.
    • マンションの管理者は,配列領域全体を管理しています.
  • 配列変数の初期化がなくても,要素は書き換えられるが,ポインタ変数の初期化がないとき,指し示す先を書き換えると不定になる.
    • 配列変数の定義により,マンションができます.初期化があれば内装済の状態で利用可ですが,なくても,部屋はあるわけですから,管理者または入居者が整備すればいいわけです.
    • ポインタ変数の定義によってできる住人は,適切な代入がなされるまで,住所不定です*1.寒風に吹かれている中,テレビやちゃぶ台を置くのは,ママゴトというものです.処理系によっては生暖かく見守るかもしれませんが,家のないところでそんな遊びをするな,と,セグメンテーションエラーで即終了にするものもあります.
  • ポインタ変数の値は変えられるが,配列変数は変えられない.
    • 居住者は流動的ですが,マンションは簡単に動かせません.
  • 配列変数もポインタ変数も,「変数名[変位]」でオブジェクトを決めることができる.
    • 居住者は,「お隣さん」を見ることができます.自分がいる部屋(ポインタ値)を起点として,何軒先(負の値でもかまいません)に何があるかを知ることになります.
    • なお,「ポインタ変数[変位]」や「ポインタ変数 + 変位」だけでは,もとのポインタ変数は動きません.それらは,(一時的な)焦点を定めるという意味にすぎません.「そっちのほうがいい」となれば,「ポインタ変数 += 変位;」とか,「ポインタ変数++;」なんてのをすることになります.
    • マンション管理者も,先頭の部屋を起点として,各部屋を見ることができます.
  • 同じ配列領域を指し示すポインタの間で,減算できる.
    • どの部屋にも電話機がありまして,部屋の居住者同士で「いま,どこなん」「おれ,ここやで」のコミュニケーションができます*2.管理人さんの電話は,ここでも,マンションの先頭の部屋にあります.
  • 文字列リテラルは書き換えられない.
    • 文字列リテラルはモデルルームです.居住体験はできますが,居住者がそこにお気に入りのものを置くことは禁じられています.まあ,いくらでも居つくことができるのは,現実のモデルルームと違うのですけどね.

*1:「無職」ではないでしょうね.型は持っていますから.

*2:言語仕様上は,異なるマンション間の通話もできますが,その通話内容に意味を求めることはできません.