• ベストアンサー

配列が0から確保される理由

配列を確保すると int a[3]; とするとa[0]から確保されます。 なぜだが忘れてしまいました。 誰か教えてください。 すいません。

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

  • ベストアンサー
  • haporun
  • ベストアンサー率40% (230/562)
回答No.1

それはあるメモリアドレスから(3*sizeof(int))バイト確保するということなので、最初のインデックスを1とすると、n番目の要素にアクセスするのに、(あるアドレス+(n-1)*sizeof(int))を計算せねばならず、面倒だからです。 通常、最初のインデックスが1であることよりも、0であるこのとほうがうれしい場合が多いです。 最初のインデックスを1としてやったほうがいい場合は、アルゴリズム的にミスしている可能性が高いです。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

その他の回答 (2)

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

配列確保の仕様は言語によって異なります。nを指定した場合 (1)1~nを確保・・Fortran、PL/Iなど (2)0~nを確保・・BASIC (3)0~n-1を確保・・C言語 C言語は、OSであるUNIXを記述するために作られた言語です。そのため高級言語の顔とアセンブラーの顔をあわせ持っています。 アセンブラー(というより機械語)では0相対アドレスが標準です。このためC言語では配列が0から取られるようになっています。 一方、アプリケーションユースでは、整数添え字が多いため、C以外のほとんどの言語では1相対が採用されています。 余談ですが、私は、BASICの仕様が一番好きです。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

言語の仕様と言ってしまえばそれまでですが、例えば int *a; という定義がされていた場合、a[1]と*(a+1)は同じものを意味します。 同様に、以下の式は全て同じものを意味します。 a[0] *(a+0) *a これらを同じにするためには、ゼロから始めておくのが分かりやすい ということではないでしょうか。

mojiraa
質問者

お礼

非常に参考になりました。 ありがとうございました。

関連するQ&A