- ベストアンサー
C言語の配列番号が"0"から始まる理由
C言語の配列番号は"0"から始まりますが "1"からではなく"0"から始める理由を教えてください。 例えば char a[5]; と宣言した場合 配列a[]は a[1], a[2], ・・・, a[5] ではなく、 a[0], a[1], ・・・, a[4] である理由を教えてください。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 a[] 配列が0から始まるのはその中身が配列スタートからの距離だからです。 a[0]は配列a[]のスタート地点です。 a[1]はa[]のスタート地点から1つ分離れた場所の値ということになります。 おそらくポインタをこれから習うと思いますが、 *p = a とした場合は *(p+1) の値は a[1] の値と同じになります。 本来の意味合いは異なりますが。 ご参考までに。
その他の回答 (7)
- pick52
- ベストアンサー率35% (166/466)
なんというか、簡単に云えばコンピュータにとっては0から始まって いる方が自然で分かりやすいわけです。 プログラミング言語はマシン語を少々人間に分かりやすくした アセンブリ言語を更に人間に分かりやすくするために作られたもの ですが、結局はコンピュータ本位なのでコンピュータに合わせなければ いけません。 何故、0から始まるのはというのを考えようとしても難しい話に なってしまいますので、単にそういうものだと覚えちゃった方が 簡単でしょう。 確かにプログラミング言語によっては添字が1から始まるものも ありますが、それはそういう仕様で作成しているだけです。 ただ、歴史的には0から始まるものだったので基本としてそのような 仕様のものが多いです。 また、途中から変更してしまうと混乱も招きます。
- yphkz4063
- ベストアンサー率23% (34/144)
それは、C言語がアセンブリ言語だからです。
- don_go
- ベストアンサー率31% (336/1059)
>C言語の配列番号は"0"から始まりますが 他の言語だと、VisualBasic(Basic), Java, C#等も0から 始まりますが、FORTRAN, COBOL等の様に1から始まる物も あります。 件名:配列の添字が0から始まるメリットは? http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=19588&forum=3&start=0
- snowize
- ベストアンサー率27% (68/245)
細かいことは既に皆さんお答えになってくださっていますが、「添え字は番号ではなくオフセットである」とはよく言いますよね。 逆に言えば「どうして1番目から始めなければならないの?」とも考えられます。1番目から数えた方が分かりやすい……というのも主観に過ぎませんよ。
お礼
> 1番目から数えた方が分かりやすい・・・というのみ主観にすぎませんよ。 確かにそうかもしれませんね。 ご指摘ありがとうございました。
- postal0x02
- ベストアンサー率42% (24/57)
CPUがどう配列を処理しているかの観点で考えるといいですよ。 int a[5]; と定義します。 a の アドレスが 0x1000 だったとします。 つまり、 a の1番目のアドレスは 0x1000 a の2番目のアドレスは 0x1001 ~~~~~~略~~~~~~~ a の5番目のアドレスは 0x1004 となります。 CPU は a[x] と指定された時、 0x1000 + x の位置として計算しますので、 1番目をさすには x は 0 である必要があります。 他の言語は...知りませんw 添え字をデクリメントしてるんでしょうかねぇ?
- mtaka2
- ベストアンサー率73% (867/1179)
ポインタと配列を同じ取り扱いにしているからです。 char a[5]; char *p = a; とあるときに、 配列へのアクセス a[i] と、 ポインタへのアクセス *(p+i) は、まったく同じ意味になります。 (それどころか、配列に対して *(a+i) というアクセスもできるし、 ポインタに対して p[i] というアクセスも可能。) C言語においては、配列アクセスのa[i] という表記方法は、 *(a+i) を、より分かりやすく記述するためのおまけ(シンタックスシュガー)なのです。 (だから、トリッキーですが i[a] という表記もアリです。i[a] は *(i+a) を意味しますから、*(a+i) である a[i] とまったく同じ意味になります。) このようなアクセス方法では、配列の要素へのアクセスは、 「先頭からいくつずらした要素にアクセスするのか」を意味します。 ですので、先頭の要素は、一つもずらしていない所の要素ということで、 配列の添え字は0から始まるのです。 添え字が1の場合は、1つずらした要素=先頭から2番目の要素、ということになります。
符号なし整数の2進数が0から始まっているからじゃないですかね。 1から始めると、0.5ビット分損しますから 00000000→0 00000001→1
お礼
なるほど。 ポインタのことは頭にありませんでした。 簡潔なご回答ありがとうございました。