次の 2 種類の配列の違いは何ですか?
int array1[10];
int* array2 = new int[10];
主な違いは、動的配列がヒープ上に作成されることです。動的配列のサイズは、実行時に決定できます。
以下の違い:
int x = 10;
int array1[10];
int *array2 = new char[x];
array2
実際の完全な配列ではなく、配列の最初の要素を指していますか。
ノート:
assert(sizeof(array1) == 40);
assert(sizeof(array2) == 4);
new で作成されたヒープ上のメモリは、最終的に を使用して破棄する必要がありますdelete
。はヒープ上に作成され、配列であるためarray2
、削除する必要がありdelete[]
ます。
注: 実際には、最初の要素だけでなく、完全な配列へのポインターを作成できます。
int array1[10];
int *pointerToFirstElement = array1;
int (*pointerToFullArray)[10] = &array1;
int sizeOfFirstPointer = sizeof(pointerToFirstElement);
int sizeOfSecondPointer = sizeof(pointerToFullArray);
assert(sizeOfFirstPointer == sizeOfSecondPointer);//==4 since both are pointers
ただし、サイズが異なることを示しています。
int sizeOfFirst = sizeof(*pointerToFirstElement);
int sizeOfSecond = sizeof(*pointerToFullArray);
assert(*sizeOfFirst == 4);
assert(*sizeOfSecond == 40);
動的配列は実行時にヒープ メモリから作成され、必要に応じて new/delete キーワードを使用して動的にサイズ変更/解放できます。配列はコンパイル時に静的に定義され、常にその量のメモリを使用します。