この宣言を考えると:
int (*Arr)[8];
int
サイズ 8 の配列のアドレスを割り当てることができます。
int data[8];
Arr = &data;
次の方法で変更できdata
ますArr
。
(*Arr)[i] = value;
を囲む括弧に注意してください*Arr
。インデックス演算子の優先順位が高いため、インデックスを適用するArr
前に逆参照する必要があります。[]
ここで理解しておくべき重要なことdata
は、動的に割り当てられないことです。スコープ外になった後もそのアドレスを保持すると、ダングリング ポインター (存在しないものを指すポインター) が得られます。
配列を動的に割り当てて に割り当てるには、次Arr
のように の結果に対して型キャストを使用できます。new
int (*Arr)[8] = reinterpret_cast<int(*)[8]>(new int[8]);
(実例はideoneにあります。)
もちろん、このような回りくどい方法でこれを行うことはあまり意味がありません。代わりに次のようにすることができます。
int* Arr = new int[8];
もちろん、代わりにstd::vectorを使用して、手動のメモリ管理を完全に回避できます。
std::vector<int> Arr;
これにより、必要に応じて独自に成長する配列が提供されます。