可変長配列とは、長さが実行時に決定される自動ストレージ期間を持った配列です。 可変長配列型は、正確なストレージの量を割り振る構成を提供します。この量は、アプリケーショ ンが実際に実行されるときに、はじめて決定することができます。
C++ は、C99
との互換性を維持するために可変長配列をサポートするように Standard C++ を拡張したものです。
この拡張には、可変長配列型への参照のサポートは含まれません。
関数仮パラメーターも、可変長配列型への参照にはならない可能性があります。
可変長配列は、次のように書き込むことができます。
>>-array_identifier--[--+-expression-----------------+--]------>< '-+---------------------+--*-' '-type-qualifier-list-'
配列のサイズが、式の代わりに、* で示される場合、 可変長配列は指定されていないサイズとして見なされます。 そのような配列は完全型として見なされますが、関数プロトタイプ・スコープの宣言でのみ使用することができます。
可変長配列および可変長配列を指すポインターは、 可変的に変更される型と見なされます。可変的に変更される 型の宣言は、ブロック・スコープまたは関数プロトタイプ・スコープで行う必要があります。 extern ストレージ・クラス指定子で宣言された配列オブジェクトは、可変長配列型を持つことができません。 static ストレージ・クラス指定子で宣言された配列オブジェクトは、可変長配列を指すポインターになれますが、実際の可変長配列にはなれません。 可変的に変更される型で宣言された ID は、普通の ID である必要があるため、構造体または共用 体のメンバーになることはできません。可変長配列は、初期化できません。
可変長配列は、 sizeof 式のオペランドとすることができます。この場合、 変数配列の各インスタンスのサイズが存続時間中に変更しなくても、 オペランドはランタイムで評価され、サイズは整数定数でも定数式でもありません。
可変長配列は、 typedef 式で使用することができます。typedef の名前は、ブロック・スコープのみを持ちます。 配列長は、typedef の名前が使用されるたびに固定するのではなく、定義されるときに固定 します。
関数仮パラメーターは可変長配列とすることができます。 必要なサイズ式を関数定義に指定しなければなりません。 コンパイラーは、関数へのエントリー時に可変に変更されたパラメーターのサイズ式を評価します。 パラメーターとして可変長配列で宣言された関数の場合、以下のように、
void f(int x, int a[][x]);
可変長配列引き数のサイズは、関数定義のサイズと一致する必要があります。
関連参照