C/C++で配列のインデックスが0から始まる理由を解説
配列インデックスがゼロから始まる仕組み
C言語やC++において、配列の要素へのアクセスは arr[i] = *(arr + i) という形で解釈されます。ここで arr は配列の先頭要素(インデックス0の要素)のアドレスを表します。つまり、*(arr + i) とは「配列の先頭要素から i だけ離れた位置にある要素」を意味します。
ループの最初では i の値が 0 であるため、*(arr + 0) は配列の最初の要素を指すことになります。このポインタ演算の仕組みこそが、配列のインデックスが 1 ではなく 0 から始まる理由です。
サンプルプログラム
以下のC++プログラムは、この動作を実際に確認できる例です。同じ配列に対して arr[i] と *(arr + i) の2通りの方法でアクセスし、結果が一致することを示しています。
#include <iostream>
using namespace std;
int main() {
int arr[] = {5,8,9,3,5};
int i;
for(i = 0; i<5; i++)
cout<< arr[i] <<" ";
cout<<"\n";
for(i = 0; i<5; i++)
cout<< *(arr + i) <<" ";
return 0;
}実行結果
5 8 9 3 5 5 8 9 3 5
プログラムの解説
このプログラムでは、5つの要素を持つ配列 arr[] を定義しています。forループを使い、まず arr[i] という通常の添字記法で全要素を出力し、次に *(arr + i) というポインタ演算による記法で同じ要素を出力しています。
実行結果を見ると、両方の出力が完全に一致していることがわかります。これは arr[i] と *(arr + i) がコンパイラによってまったく同じものとして扱われることを証明しています。該当するコード部分は以下の通りです。
int arr[] = {5,8,9,3,5};
int i;
for(i = 0; i<5; i++)
cout<< arr[i] <<" ";
cout<<"\n";
for(i = 0; i<5; i++)
cout<< *(arr + i) <<" ";まとめ
配列名は本質的には先頭要素へのポインタとして機能するため、「i番目の要素」は「先頭アドレスから i 要素分進んだ位置」として計算されます。i = 0 のとき先頭要素そのものを指すため、C/C++の配列インデックスは必然的に 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 →