C/C++の配列インデックスが0から始まる理由とは?ポインタ演算の仕組みを解説
C言語やC++言語において、配列のインデックス(添字)は慣例的に「0」から始まります。これは単なる設計上の好みではなく、言語の内部的な仕組み——特にポインタ演算——と深く関係しています。
ポインタ演算との関係
配列のインデックスが0から始まる最大の理由は、a[i] が *(a + i) というポインタ演算として実装できる点にあります。ここで a は配列の先頭要素へのポインタ、i は先頭からのオフセット(ずらし幅)を表します。
インデックスが0から始まれば、a[0] は *(a + 0)、つまり先頭要素そのものを意味し、アドレス計算が非常にシンプルになります。
もしインデックスが1から始まったら?
仮に配列のインデックスが1から始まる仕様だった場合、a[i] は *(a + i - 1) として実装する必要があります。この「-1」という余分な減算処理が要素アクセスのたびに発生するため、コンパイル時の処理が複雑化し、プログラムの実行パフォーマンスにも悪影響を及ぼします。
このような理由から、C/C++では配列のインデックスを0から始める設計が採用されているのです。
サンプルコード
ポインタ演算を使って配列の各要素にアクセスする簡単なプログラムを以下に示します。
int main() {
int array[5] = {7, 7, 7, 6, 6};
for (int i = 0; i < 5; i++)
cout << *(array + i);
return 0;
}
実行結果
7 7 7 6 6
まとめ
配列のインデックスが0から始まるのは、インデックスを「先頭からのオフセット」として扱うことで、ポインタ演算 *(a + i) を効率的かつシンプルに実装できるためです。もし1から始めると余分な減算が発生し、パフォーマンスの低下につながるため、0始まりが最も合理的な設計と言えます。
-
【初心者向け】C/C++における多次元配列の初期化方法をわかりやすく解説
多次元配列とは、次元数が2以上ある配列のことです。本記事では、3×3×3の多次元配列におけるメモリ割り当ての仕組みと、実際に配列を初期化して内容を表示するC++プログラムを紹介します。下図は、次元が3×3×3の多次元配列に対するメモリ割り当ての戦略を示したものです。アルゴリズム多次元配列を初期化するプログラムは、以下の手順で構成されます。Begin 多次元配列の要素を初期化する 配列のサイズを出力する 配列の内容を表示する Endサンプルコード以下は、2行2列の二次元配列を初期化し、そのサイズと内容を出力するC++プログラムです。#include<iostream
-
C#の配列はなぜインデックス0から始まるのか?その理由を解説
配列とメモリアドレスの関係配列とは、本質的にはメモリ上の特定アドレスへのポインタです。このアドレスが指す先が配列の最初の要素にあたり、インデックスはそこからの「オフセット(相対的なずれ)」として扱われます。実はこの考え方自体は、C言語が誕生する以前から存在していた概念なのです。例えば、配列の要素がアドレス 0Xff000 から始まり、{35, 23, 67, 88, 90} の5つの要素を持つとします。int型は4バイトで格納されるため、メモリ上では次のように配置されます。0Xff000 → 35 0Xff004 → 23 0Xff008 → 67 0Xff012 → 88 0Xff016 →