配列(C++)
言語構造:インデックス への移動
次の宣言は、
- type declarator [<constant-expression>]
type 型の要素で構成される配列を宣言します。 配列は、その要素をすべて保持するのにぴったりの大きさの連続した記憶領域から構成されます。
配列の宣言に式を記述する場合は、正の整数の定数でなければなりません。 この値は、配列の要素数を表します。 配列の各要素には、0 から、要素数 - 1 までの番号が振られます。
多次元配列は、配列型の配列を宣言することによって作成します。 次の例は、2 次元配列を宣言する方法の 1 つを示しています。 この実装は、3 行×4 列の配列用になっていますが、実行時のユーザー入力を受け付けるように、簡単に変更することができます。
/* DYNAMIC MEMORY ALLOCATION FOR A MULTIDIMENSIONAL OBJECT. */
// ---------------------------------------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <vcl.h>
#pragma hdrstop
#include <tchar.h>
// ---------------------------------------------------------------------------
#pragma argsused
int _tmain(int argc, _TCHAR* argv[]) {
double **m;
const int rows = 3, columns = 4;
unsigned int i, j;
/* SET UP THE ROWS */
m = (double**) calloc(rows, sizeof(double*));
/* SET UP THE COLUMNS */
for (i = 0; i < rows; ++i) {
m[i] = (double*) calloc(columns, sizeof(double));
}
/* INITIALIZE */
for (i = 0; i < rows; i++) {
for (j = 0; j < columns; j++) {
m[i][j] = (double)(i + j) / 10.0;
}
}
for (i = 0; i < rows; ++i) {
puts("");
for (j = 0; j < columns; ++j) {
printf("%4.4lf \t", m[i][j]);
}
}
/* DEALLOCATE */
/* DELETE EACH COLUMN */
for (i = 0; i < rows; i++) {
free(m[i]);
}
/* DELETE BASE POINTER */
free(m);
return 0;
}
// ---------------------------------------------------------------------------
このコードの出力は次のようになります。
0.0000 0.1000 0.2000 0.3000
0.1000 0.2000 0.3000 0.4000
0.2000 0.3000 0.4000 0.5000
特定のコンテキストでは、一連の宣言の最初の配列宣言に、角かっこで囲まれた式がない場合があります。 このような配列は、サイズが不定の配列です。 これは、スペースを確保するために配列のサイズが不要であるようなコンテキストで許されます。
たとえば、配列オブジェクトの extern 宣言では、配列の正確な大きさは必要ありません。また、配列関数のパラメータも必要ありません。 ANSI C の特殊な拡張として、C++Builder では、構造体の最後のメンバを不定サイズの配列にすることも許されています。 このような配列によって構造体のサイズが増えることはありません(ただし、配列が適切なアラインメントになるように、パディングを追加する場合は除く)。 これらの構造体は、通常は動的割り当てによって使用されます。適切なスペースを確保するには、実際に必要な配列のサイズを、構造体のサイズに明示的に追加しなければなりません。
sizeof 演算子または & 演算子のオペランドになる場合以外は、配列型の式は、その配列の最初の要素へのポインタに変換されます。