数学やコンピュータプログラミングにおいて、インデックス表記は数値配列の要素を指定するために用いられます。インデックスの使用方法は、対象分野によって異なります。特に、リスト、ベクトル、行列の要素を参照する方法は、出版用の正式な数学論文を書く場合と、コンピュータプログラムを作成する場合とで異なります。
数学では、配列の要素を添え字で参照することがしばしば便利です。添え字は整数または変数です。配列は一般にテンソルの形をとります。これは、テンソルを多次元配列として扱うことができるためです。より一般的な例としては、ベクトル(1次元配列)と行列(2次元配列)があります。
以下は概念の簡単な紹介に過ぎません。添え字表記は数学(特にテンソル演算の表現と操作)においてより詳細に用いられます。詳細については、メイン記事を参照してください。
ベクトルを数値の配列として扱うには、行ベクトルまたは列ベクトルとして記述します(どちらを使用するかは、利便性または状況によって異なります)。
インデックス表記法では、配列の要素を単に i と記述するだけで示すことができます。ここで、インデックスi はn次元であるため、1 からnまで変化することがわかっています。 [ 1 ] 例えば、次のベクトルが与えられた場合:
すると、いくつかのエントリは次のようになります。
この表記法は、数学や物理学におけるベクトルに適用できます。次のベクトル方程式
ベクトルの要素(別名成分)で表すこともできます。
ここで、インデックスは特定の範囲の値をとります。この式は、各インデックスに対応する一連の方程式を表します。ベクトルがそれぞれn個の要素を持つ場合、つまりi = 1,2,… n の場合、方程式は明示的に次のようになります。
したがって、インデックス表記は効率的な省略記法として機能します。

複数のインデックスは、行列の要素など、2 次元以上の数値配列を記述するために使用されます (右の画像も参照)。
行列Aの要素は、2 つのインデックスiとjを使用して、インデックスを区切るコンマの有無にかかわらず、a ijまたはa i,jと記述されます。ここで、最初の添え字は行番号、2 番目の添え字は列番号です。並置は乗算の表記としても使用されますが、これは混乱の原因となる可能性があります。たとえば、
すると、いくつかのエントリは次のようになります。
9より大きいインデックスの場合は、コンマベースの表記の方が望ましい場合があります(例:312ではなく3,12 )。
行列方程式は、ベクトル方程式と同様に記述されます。
行列の要素(別名コンポーネント)の観点から
iとjのすべての値に対して。この式は、インデックスごとに 1 つの方程式のセットを表します。行列がそれぞれm行n列、つまりi = 1, 2, …, m、j = 1, 2, …, n である場合、方程式はmn個あります。
この表記法では、要素の多次元配列、つまりテンソルへの明確な一般化が可能です。例えば、
多数の方程式の集合を表す。
テンソル解析では、共変要素と反変要素を区別するために、下付き文字の代わりに上付き文字が使用されます。ベクトルの共変性と反変性、およびインデックスの上げ下げを参照してください。
いくつかのプログラミング言語では、配列の要素を指定する方法としてインデックス表記が用いられます。この方法は、アセンブリ言語での実装方法に最も近いため採用されています。アセンブリ言語では、最初の要素のアドレスを基点とし、要素サイズの倍数(インデックス)を用いて配列内の要素を指定します。
例えば、整数の配列が、アドレス 3000 (ベース アドレス)のメモリセルから始まるコンピュータのメモリ領域に格納され、各整数が 4 セル (バイト) を占める場合、この配列の要素はメモリ位置 0x3000、0x3004、0x3008、…、0x3000 + 4( n − 1) にあります ( 0 ベースの番号付けに注意)。一般に、ベース アドレスbと要素サイズsを持つ配列のi番目の要素のアドレスはb +です。
C言語では、上記を*(base + i)(ポインタ形式)またはbase[i](配列インデックス形式)と記述できますが、これはC標準で配列インデックス形式がポインタ形式への変換として定義されているため、完全に等価です。偶然にも、ポインタの加算は可換であるため、これは、と3[base]等価ななどの難解な式を可能にしますbase[3]。[ 2 ]
複数のインデックスを持つ配列、例えば2次元テーブルを考えると、事態はさらに興味深いものになります。考えられる可能性は3つあります。
C言語では、3つの方法すべてを使用できます。最初の方法を使用する場合、プログラマは配列の要素がコンピュータのメモリ内でどのように配置されるかを決定し、各要素の位置を計算する式を提供します。2番目の方法は、各行の要素の数が同じで、プログラム作成時にわかっている場合に使用します。プログラマは、たとえば と記述して、配列に3つの列があることを宣言しますelementtype tablename[][3];。次に、 と記述して、配列の特定の要素を参照しますtablename[first index][second index]。コンパイラは、各行が占有するメモリセルの総数を計算し、最初のインデックスを使用して目的の行のアドレスを見つけ、次に2番目のインデックスを使用して、行内の目的の要素のアドレスを見つけます。3番目の方法を使用する場合、プログラマは、 のように、テーブルをポインタの配列として宣言しますelementtype *tablename[];。その後、プログラマが特定の要素 を指定するとtablename[first index][second index]、コンパイラは、最初のインデックスで指定された行のアドレスを検索し、このアドレスをベースとして、2番目のインデックスで指定された要素のアドレスを計算する命令を生成します。
void mult3x3f ( float result [][ 3 ], const float A [][ 3 ], const float B [][ 3 ]) { int i , j , k ; for ( i = 0 ; i < 3 ; ++ i ) { for ( j = 0 ; j < 3 ; ++ j ) { result [ i ][ j ] = 0 ; for ( k = 0 ; k < 3 ; ++ k ) result [ i ][ j ] += A [ i ][ k ] * B [ k ][ j ]; } } }Pascalなどの他のプログラミング言語では、インデックスは1から始まる場合があるので、メモリブロックのインデックス付けは、単純な線形変換によって1から始まるアドレッシング方式に合わせることができます。この方式では、ベースアドレスb、要素サイズsのi番目の要素のメモリ位置はb + ( i − 1) sです。