ポインターを使用するときは、常に動的メモリを使用していると思いました。そうじゃない?
いいえ、そうではありません。たとえば
int i;
int *p = &i; // uses a pointer to static memory, no dynamic memory.
ただし、文字配列の長さを指定していない char* p などのポインターを宣言するときに、動的メモリを使用しているようです。
char[100] string;
char* p = &(string[0]); // Same as above, no dynamic memory.
データ構造に必要な大きさがわからない場合は、動的メモリが必要です。
ファイルからいくつかの int を読み取り、それらをメモリに格納する必要があるとします。必要な int の数がわかりません。100 の数値を選択することもできますが、101 があるとプログラムが壊れます。それで十分だと期待して 100,000 を選択することもできますが、ファイルに 10 しかない場合はリソースの無駄です。ファイル。
このシナリオでは、プログラムはファイルを反復処理し、int の数を数えてから、正しいサイズの配列を動的に作成できます。次に、int を新しい配列に読み込むために、もう一度ファイルを渡します。
静的 v の動的メモリ
静的メモリは、プログラムがコンパイルされると変更できないため、静的です。関数で宣言する変数、およびクラス/構造体で宣言されたメンバーは静的です。コンパイラは、各メソッドが呼び出されるときに必要になるそれぞれの数を正確に計算します。
動的メモリは、実行時に必要に応じてプログラムで使用できるメモリの「プール」です。コンパイラは、そのメモリの一部 (おそらく不明) を割り当て、そのメモリを解放して動的メモリ プールに戻す必要があることを認識しているだけです。
お役に立てれば。
PSはい、不明な数のアイテムをメモリに入れるより効率的な方法がありますが、これが最も簡単に説明できます