配列

array は、同じデータ型のオブジェクトのコレクションです。配列内の個々のオブジェクト elements は、配列内のそれらの位置を基にしてアクセスされます。添え字演算子 ([]) は、配列エレ メントへの指標を作成する方法を提供します。 このアクセス形式は、指標付け または サブスクリプト付け と呼ばれます。 配列では、各エレメントで実行されたステートメントを、配列内の各エレメントを通って繰り返 されるループへ入れることができるために、反復タスクのコーディングが容易になります。

C および C++ 言語には、個々のエレメントの読み取りおよび書き込みができる、配列型用の限定された組み込みサポートがあります。 ある配列を別の配列に割り当てたり、2 つの配列を同じかどうか比較し、自己認識サイズを戻したりする操作は、いずれの言語でもサポートされていません。

配列型は、特定型のオブジェクトのセット用に隣接して割り振られたメモリーを表します。 配列型は、いわゆる配列型派生 内で、エレメントの型から派生します。 配列オブジェクトの型が不完全な場合、配列型も不完全であると見なされます。

配列エレメントは、void 型にも関数型にもすることができま せん。ただし、関数へのポインター配列は許可されます。C++ では、配列エレメントは参照型 にも抽象クラス型にもすることができません。

C 同じように修飾された 2 つの配列型は、それ らのエレメントの型に互換性があれば、同様に互換性があります。例えば、次のような場合です。

char ex1[25];
const char ex2[25];

には、互換性はありません。互換性のある 2 つの配列型の複合型は、 複合エレメント型を持つ配列です。オリジナルの型のサイズはどちらも同等でなければなり ません (既知である場合。オリジナルの配列型の 1 つのサイズが既知である場合、複合型はそのサイズを持ちます。 例えば:

char ex3[];
char ex4[42];
この場合、ex3ex4 の複合型は char[42] となります。元の型のいずれかが可変長配列である場合、複合型はその型です。

特定のコンテキスト内を除いて、 サブスクリプトされていない配列名 (例えば、region[4] ではなく region) は、配列がすでに宣言されている場合、配列の最初のエレメントのアドレスを値に持つポインターを表します。 例外は、配列名が配列自身を渡す場合です。 例えば、配列名は、それが sizeof 演算子またはアドレス (&) 演算子のオペランドであるときに、配列全体を渡します。

同様に、関数のパラメーター・リスト内の配列型は、対応するポインター型に変換されます。引き数配列のサイズ情報は、配列が関数本体内部からアクセスされるときに失われます。

C 最適化に有益なこの情報を保存する には、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                 */

関連参照

IBM Copyright 2003