array は、同じデータ型のオブジェクトのコレクションです。配列内の個々のオブジェクト elements は、配列内のそれらの位置を基にしてアクセスされます。添え字演算子 ([]) は、配列エレ メントへの指標を作成する方法を提供します。 このアクセス形式は、指標付け または サブスクリプト付け と呼ばれます。 配列では、各エレメントで実行されたステートメントを、配列内の各エレメントを通って繰り返 されるループへ入れることができるために、反復タスクのコーディングが容易になります。
C および C++ 言語には、個々のエレメントの読み取りおよび書き込みができる、配列型用の限定された組み込みサポートがあります。 ある配列を別の配列に割り当てたり、2 つの配列を同じかどうか比較し、自己認識サイズを戻したりする操作は、いずれの言語でもサポートされていません。
配列型は、特定型のオブジェクトのセット用に隣接して割り振られたメモリーを表します。 配列型は、いわゆる配列型派生 内で、エレメントの型から派生します。 配列オブジェクトの型が不完全な場合、配列型も不完全であると見なされます。
配列エレメントは、void 型にも関数型にもすることができま せん。ただし、関数へのポインター配列は許可されます。C++ では、配列エレメントは参照型 にも抽象クラス型にもすることができません。
同じように修飾された 2 つの配列型は、それ
らのエレメントの型に互換性があれば、同様に互換性があります。例えば、次のような場合です。
char ex1[25]; const char ex2[25];
には、互換性はありません。互換性のある 2 つの配列型の複合型は、 複合エレメント型を持つ配列です。オリジナルの型のサイズはどちらも同等でなければなり ません (既知である場合。オリジナルの配列型の 1 つのサイズが既知である場合、複合型はそのサイズを持ちます。 例えば:
char ex3[]; char ex4[42];この場合、ex3 と ex4 の複合型は char[42] となります。元の型のいずれかが可変長配列である場合、複合型はその型です。
特定のコンテキスト内を除いて、 サブスクリプトされていない配列名 (例えば、region[4] ではなく region) は、配列がすでに宣言されている場合、配列の最初のエレメントのアドレスを値に持つポインターを表します。 例外は、配列名が配列自身を渡す場合です。 例えば、配列名は、それが sizeof 演算子またはアドレス (&) 演算子のオペランドであるときに、配列全体を渡します。
同様に、関数のパラメーター・リスト内の配列型は、対応するポインター型に変換されます。引き数配列のサイズ情報は、配列が関数本体内部からアクセスされるときに失われます。
最適化に有益なこの情報を保存する
には、static キーワードを使用する引き数配列の指標を宣言します。
定数式は、最適 化の前提事項として使用できる最小のポインター・サイズです。
static キーワードのこの特定の使用は、厳格に規定されています。 このキーワードは、最外部配列型派生および関数仮パラメーター宣言においてのみ表示することがで きます。 関数の呼び出し元がこれらの制限に従わないと、未定義の振る舞いがとられることになります。
この言語フィーチャーは、C99 言語レベルで使用できます。
フィーチャーの使用例を次に示 します。
void foo(int arr [static 10]); /* arr points to the first of at least 10 ints */ void foo(int arr [const 10]); /* arr is a const pointer */ void foo(int arr [static const i]); /* arr points to at least i ints; i is computed at run time. */ void foo(int arr [const static i]); /* alternate syntax to previous example */ void foo(int arr [const]); /* const pointer to int */
関連参照