添字表記法
2 つ目の方法は、各行の要素数がすべて同じであることがコードを書く時点で分かっているような場合に用いられる。プログラマは配列の列数だけを指示すればよく、3列の配列を使う場合、ElementType tableName[][3]; と指定する。この配列の特定の要素を参照する場合には tablename[first index][second index] と書けばよい。コンパイラは各行が占有するメモリ領域の合計を計算し、第一の添字から要求された行のアドレスを探し、第二の添字によってその行の指定された要素のアドレスを探し出す。
3 つ目の方法を用いる場合、elementType *tableName[]; のように配列の要素がポインターとなるように宣言する。プログラマが特定の要素を参照するためには tablename[first index][second index] と書けばよく、コンパイラは最初の添字によって指定された行のアドレスを参照し、そのアドレスを用いて第二の添字から指定された要素のアドレスを計算するような指示を生成する。
C言語では上述の配列を、添字演算子 [] を用いて base[index] と表すか、あるいは間接参照演算子 * を用いて *(base + index) と表すことができる。C言語の標準的な実装では、添字演算子による表現も間接参照演算子による表現も全く等価であり、前者の添字演算子による参照は後者のアドレスと間接参照演算子を用いた形に変換される。間接参照による表現 *(base + index) を見れば明らかなように、base と index は交換可能である。したがって、index[base] と base[index] は等価である。
C++など他のプログラミング言語においても、配列のようなコンテナをC言語と同様に添字演算子を用いて表現することがあるが、添字演算子の定義は上述のC言語におけるものと必ずしも同一でなく、特に間接参照演算子やアドレス演算子 & との組み合わせについて注意を要する。何故ならC++等では、既述の演算子の意味が、文脈によりC言語での意味とは変わる事があるため。たとえば単純な配列では添字演算子の左右のオペランドは交換可能だが、通常用いられる多くのコンテナにおいては交換可能ではない。まず、一般には *base は base[0] と等価ではなく、base は &base[0] と等価ではない。また、素朴な配列では base 自身がデータ領域の先頭アドレスを指すポインタ変数として扱われ、整数との加算が定義されたイテレータの役割を果たすが、一般のコンテナでは base はイテレータ型でないかイテレータであっても整数との加算が定義されていないため、*(base + index) という記述も未定義である。