プロが教えるわが家の防犯対策術!

配列に関するページでの説明文(http://ja.wikipedia.org/wiki/%E9%85%8D%E5%88%97# …)を閲覧しました際に、或る表現の意味が気になりました。

それは「古典的な言語では添え字は非負整数であり、…」という内容です。

そこで、唐突な表現で畏れ入りますが、御伺いを致します。

そもそも、メモリ上で連続した領域へデータが並べられている際に、その番地への直接的なアクセスの為に、添え字を添えるのだろう、と私は勝手に考えていたのですが、上記のページの説明で【非負整数】の状態が殊更に説明されている事情から類推しますと、メモリの番地に負整数の番号を割り当てても構わなくなっているのでしょうか? 

A 回答 (2件)

> メモリ上で連続した領域へデータが並べられている際に、その番地への直接的なアクセスの為に、添え字を添える



ちがいます。
そんな直接的にアクセスするは、アセンブリくらいです。

配列をどう実現するかは、その言語/処理系しだいです。
連続に配置される必要はかならずしもありません。
添字と記憶領域が対応してればいいのですから。

特に、そのURLにある「連想配列」は添字は「整数」ですらありません。
その部分の記述は、文字列や負の値など「なんでも」添字になり得る「連想配列」を説明するために、従来の配列の性質を説明しているにすぎません。

また、メモリ上に連続に配置するとしても、添字がそのままメモリの番地になるわけでもありません。
「最初の要素のアドレス」 + (「添字」-「最初の要素の添字」) x 「1要素あたりに必要なアドレスサイズ」
(添字が0から始まる配列で、a[5] だったら 「a[0]のアドレス」 + (5 -0) x 「a[i]一つ一つに必要なアドレスサイズ」)
とするのが普通です。
たとえ、添字に負が与えられたとしても、最終的なアドレスが負になるわけではありません(普通は、その前に添字の範囲外としてエラーになりますが)
さらに、計算の結果が負になったとしても、CPUは、内部表現が同じ「正」のアドレスとして処理するので、「負のアドレス」自体が存在しません。

この回答への補足

有り難う御座います。

良く分かりました。

補足日時:2011/06/11 05:41
    • good
    • 0

>メモリ上で連続した領域へデータが並べられている際に、


>その番地への直接的なアクセスの為に、

というのが古典的な発想だということです。

近年のコンピュータは十分に高速ですから,
実際のメモリにはどんな風にデータが並んでいるかなどというハードウェア側の事情はいっさい忖度せず,人間側の事情だけを考えて好きなように扱いやすいように自由にデータ構造を設計することができます。

古典的なプログラム言語では,下記のような添字しか認めていなかったとしても,

 0 1 2 3 4 5 6 7 8
+―+―+―+―+―+―+―+―+―+
|Y|a|G|h|o|o|g|L|e|
+―+―+―+―+―+―+―+―+―+

配列の末尾と先頭が連結してリングを構成しているイメージで,
「配列の先頭から11文字進んだ位置から4文字を取り出したい」とか
「配列の先頭から7文字さかのぼった位置から4文字を取り出したい」などのニーズが人間側にあるのなら,
そういう添字を認めるような進歩的なプログラム言語を考えればよいということです。

 9 10 11 12 13 14 15 16 17
+―+―+―+―+―+―+―+―+―+
|Y|a|G|h|o|o|g|L|e|
+―+―+―+―+―+―+―+―+―+

0 -8 -7 -6 -5 -4 -3 -2 -1
+―+―+―+―+―+―+―+―+―+
|Y|a|G|h|o|o|g|L|e|
+―+―+―+―+―+―+―+―+―+

コンピュータは高速に演算処理をおこない,最終的にはそれを実メモリ上の非負整数の番地へと変換してくれます。

この回答への補足

有り難う御座います。

良く分かりました。

補足日時:2011/06/11 05:43
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!