vectorクラスの利用
事前にサイズのわからないファイルを読み込むときなど、途中でサイズの変えられる配列を使いたいことがあります。C言語なら realloc() を用いれば実現できますが、C++の場合は一工夫必要です。
C++の場合、標準ライブラリの vectorクラスを用いるのが楽でしょう。具体的には以下のようになります。
#include <vector>
int main(){
using namespace std;
vector<double> array(1000); // 初期容量
double *a = &array.at(0);
// a[0]~a[999]が使用可能
array.resize(3000); // 容量を増加させる
a = &array.at(0); // ポインタの取り直し
// a[0]~a[2999]が使用可能
array.resize(500); // 容量を減少させる
// a[0]~a[499]が使用可能
return 0;
}
容量を増加させる際にはメモリ領域が移動する可能性がありますので、ポインタの取り直しが必要です。容量を減少させる場合にはメモリ領域は移動しませんので、ポインタの取り直しは必要ありません。
あと注意ですが、容量を減少させても、一旦拘束されたメモリは解放されません。メモリを解放したい場合は、詳しい説明は省きますが、array.shrink_to_fit() 関数を用いるか、vector<double>(array).swap(array); とします。その場合、ポインタの取り直しが必要です。
また、メモリ領域のポインタを取得する a = &array.at(0); は、最近のC++のバージョンでは専用の関数を用いて a = array.data(); としても出来ます。