• ベストアンサー

配列について

プログラミング言語一般の配列について思うことがあるのですが、 仮にJavaScriptで話を進めます。 (JavaScriptの配列は、正確には連想配列としての実装で、 インデックスに数字を使用するときは自動的に文字列に 置き換えられるそうですが、その辺の話は無視させてください。) 本やネットなどで配列に関する説明を見ると、 「var a=new Array(3);で、a[0],a[1],a[2]の3つの配列要素が確保される」などとあり、 図解なんかでは、一つ目の箱にa[0]、2つ目の箱にa[1]などと 書かれていて、普通の変数の場合と同様に、あたかもa[0]やa[1]が個々の要素の名前のように解説してある場合が多いのですが、 どうもこれって違うんじゃないのかって気がしてしょうがないです。 配列の1番目の要素にアクセスする手段として、a[0]と記述するのであって、 a[0]そのものが個々の要素の名前ではないですよね。 名前だとしたら、a[0]は文字列でなくてはいけないと思うのですが、 みなさんはどう思われますか? まぁ、実際プログラミングする際にはどうでもいいような話かも知れませんが(^^; よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#11476
noname#11476
回答No.6

まず、文字列としての名前は、基本的には人間が分かり易くコンピュータに指示するために付けられている物ですから、コンピュータ自身が変数を管理するために使用しているわけではありません。 人間からの指示を読み込むときに使われるだけです。根本的には。ただ、言語レベルで見ると文字列としての扱いが本質的な言語もあります。(LISPなど) 次に、配列の要素についてですがこれは言語に依存します。例えばC言語では int a[100] と宣言した場合は連続的なアドレスに配置されることが保証されています。 つまり、aと名付けられた「アドレス」(CPUが扱うのはこちらで、名前は絶えずアドレスに変換してから取り扱います)に対して何番目という形式で要素にアクセスします。 a[2] ならば *(a + 2) と同じで、つまりaという名前のアドレスに2と言うインデックスを加えた場所という意味になります。 これだとharisunさんが言われるようにaという名前の箱のような物を思い浮かべればよいでしょう。 しかし、すべての言語でこれが保証されているわけではありません。言語によっては不連続なアドレスに確保される場合があります。 この場合、a[10]という配列を宣言しても、a[5] が アドレスaから5番目という保証はありません。 つまり、a[5]という一つの変数名として考える必要があります。 要はどんな言語を使うかによって変わってきます。 なので、 >実際プログラミングする際にはどうでもいいような話かも知れませんが(^^; そうとはいえず、プログラミングで連続に配列が確保されることが保証されていない言語で、連続性を仮定したインデックス参照(a+2の様な)を行うと予測できない動作を引き起こします。 重要な事項なのでプログラムを作るときには注意しましょう。 では。

harisun
質問者

お礼

どうもありがとうございました。 なるほど、不連続なアドレスに確保されるときは 変数名となるわけですね。 納得しました。

その他の回答 (5)

  • Nickee
  • ベストアンサー率15% (14/93)
回答No.5

再度 登場します。 Nickeeです。JavaじゃなくCの話ですけど、多分一緒だと思うのではなします。 >この場合のa[0]は変数名ではありませんよね・・・ これに対して自分の意見としては変数名と一緒の役割を果たしていると思うのですが。。 なぜ、変数名でないのと思っているのか教えてもらえないでしょうか? あまり自分にも自信がないものですから。

harisun
質問者

お礼

再度ありがとうございます。 私も役割としては変数名と同等の役割をしていると思います。 でも厳密には少し違うんじゃないかという気がして・・。 わたしの解釈ですと、配列というのは、 箱の中に仕切りで仕切られたスペースがあって、 それぞれのスペースにデータが入っているというイメージです。 それで、それぞれのスペースには名前などないんじゃないかと思うのです。 ただ名前がなくても、箱の中の何番目かを指定することによって、 目的のスペースのデータにアクセスすることは出来ますよね。 a[0]の0はサブルーチンで言うところの引数のようなもので、 データを参照したいときに、あくまでこちら側で指定してあげるものですよね。 わたしは、変数などが内部でどのように管理されているのかなどは よくわからないのですが、 単独の変数aの場合は、変数名aというのをコンピュータがどこかで認識していて、 変数の値を参照したりするときは、その変数名によってアクセスしていると思うのですが、 配列の場合、先ほども書いたように名前で参照しているわけではないと思うのです。 つまりa[0]というのを認識しているわけではないんじゃないかと・・。 このように参照の仕方が違うと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

「本の説明がa[0]が変数名と説明している」との御説に対し、そうではないと思います。著者の意を十分尽くしていないだけだと思います。 ある手許のVB系の1書では、「各要素は変数名とインデックス番号で表され・・・」とあり、変数名はa[0]のaであることを説明していると思う。 他書では「イメージ的に言えば、ワークシートのセルのデータ全てを1つの変数でまとめてあつかっているようなもの」と暗に、変数名は1つaであることを言っている。( ただ配列名を言っているかもしれない。他に「配列の名前は変数と同じ規則に従って付けてください」と「 配列名」と言う用語が出てくるが、変数名との関連は何も言っていない。) A=xx(通常ではAは変数)というが記述が一般に許るされ、○=xx(値)という表現が可能-->「○は変数扱いAND思考の上でも変数と考える」は起こり得るし自然であると思う。 ○=xx(値)の記述が許るされるケースで、○は変数か。 メモリー上に確保するのでないかもしれない、レジスター番号をセットする独立ステートメントREG=2が許されたとしたら、そのREGは変数というのかなと思いました。(他にプログラム上に記述するものはほとんどメモリーの上にセットする(影響する)と思うが)コンパイラーに対する指令があって、○○○=xxxと表現を許された場合などは、○○○は変数とは言わない稀少例になると思う。

harisun
質問者

お礼

いろんな書物を参照していただいて、 どうもありがとうございます。 メモリーやレジスターとかの話になると わたし疎いもので(^^;

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

配列で添え字を指定した場合(配列の要素)は単独の変数名と全く等価です。 これはどの言語でも同じです。 a[0]は立派に変数名の代用を果たしています。文字列かどうかは無関係です。 aは球団名、[ ]は背番号を示すとしましょう。 古い話で恐縮ですが、巨人[3]と「長島」は同じ意味ですよね。

harisun
質問者

お礼

どうもありがとうございます。 わたしもa[0]の役割としては、変数名と同等であろうと 思ってはいるのですが・・。

  • Nickee
  • ベストアンサー率15% (14/93)
回答No.2

個々の要素の名前?  う~ん 意味がわかりませんが。 a[0],a[1]がそれぞれの住所みたいなものを示していて、値がそれぞれの住所の中に入っていると想像しています。 文字列の場合は、%sで出力する時は、その住所からヌルまで出力すると言う前提条件でなりったていると思って使っていたのですが。。。

harisun
質問者

お礼

ご回答ありがとうございます。 < 個々の要素の名前? < う~ん 意味がわかりませんが。 普通の変数の場合、値を設定するとき、 変数名=値 ですよね。 配列の場合は、 a[0]=値となりますが、 この場合のa[0]は変数名ではありませんよね・・・ でもa[0]自体も変数名であるかのごとく 扱ってる本などが多いんじゃないのか・・ と言いたかったんです。

  • hokuto_ds
  • ベストアンサー率45% (106/233)
回答No.1

「どう思うか」ってことで、「こう思う」ってことを。 この場合の a[0] って、目当てのオブジェクトにアクセスするための「パス」のような気がするんですが。つまり位置指定ですね。その場所に a[0] の中身があるよー、という。 (しかしこれはオブジェクト指向のプログラムしかやったことのない人間の頭かも;) その「箱」の話も、要は a[0] という住所のラベルが貼ってあると思えば‥いいのかなぁ‥。(aという地域の[0]という番地、って感じで) 自信のない意見ですが、ご参考までに。

harisun
質問者

お礼

ご回答ありがとうございます。 「パス」のようなもの・・・なんとなくわかります。 ありがとうございました。