以下两种类型的数组有什么区别?
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 关键字动态调整大小/释放。数组是在编译时静态定义的,并且总是会一直占用该数量的内存。