- ベストアンサー
配列が0から確保される理由
配列を確保すると int a[3]; とするとa[0]から確保されます。 なぜだが忘れてしまいました。 誰か教えてください。 すいません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
それはあるメモリアドレスから(3*sizeof(int))バイト確保するということなので、最初のインデックスを1とすると、n番目の要素にアクセスするのに、(あるアドレス+(n-1)*sizeof(int))を計算せねばならず、面倒だからです。 通常、最初のインデックスが1であることよりも、0であるこのとほうがうれしい場合が多いです。 最初のインデックスを1としてやったほうがいい場合は、アルゴリズム的にミスしている可能性が高いです。
その他の回答 (2)
- ymmasayan
- ベストアンサー率30% (2593/8599)
配列確保の仕様は言語によって異なります。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の仕様が一番好きです。
お礼
非常に参考になりました。 ありがとうございました。
- ranx
- ベストアンサー率24% (357/1463)
言語の仕様と言ってしまえばそれまでですが、例えば int *a; という定義がされていた場合、a[1]と*(a+1)は同じものを意味します。 同様に、以下の式は全て同じものを意味します。 a[0] *(a+0) *a これらを同じにするためには、ゼロから始めておくのが分かりやすい ということではないでしょうか。
お礼
非常に参考になりました。 ありがとうございました。
お礼
非常に参考になりました。 ありがとうございました。