C++ 数组和动态数组之间的区别是什么?
以下两种类型的数组之间有什么区别C++ 数组和动态数组之间的区别是什么?,c++,arrays,dynamic-allocation,C++,Arrays,Dynamic Allocation,以下两种类型的数组之间有什么区别 int array1[10]; int* array2 = new int[10]; 主要区别在于在堆上创建了一个动态数组。动态数组的大小可以在运行时确定 不同之处如下: int x = 10; int array1[10]; int *array2 = new char[x]; 是指array2指向数组的第一个元素,而不是实际的完整数组 注: 使用new创建的堆上的内存最终应该使用delete销毁。 由于array2是在堆上创建的,并且是一个数组,因此您需
int array1[10];
int* array2 = new int[10];
主要区别在于在堆上创建了一个动态数组。动态数组的大小可以在运行时确定 不同之处如下:
int x = 10;
int array1[10];
int *array2 = new char[x];
是指array2
指向数组的第一个元素,而不是实际的完整数组
注:
使用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);
主要区别在于在堆上创建了一个动态数组。动态数组的大小可以在运行时确定 不同之处如下:
int x = 10;
int array1[10];
int *array2 = new char[x];
是指array2
指向数组的第一个元素,而不是实际的完整数组
注:
使用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关键字动态调整/释放数组的大小。数组是在编译时静态定义的,并且将始终占用该内存量。动态数组是在运行时从堆内存创建的,可以根据需要使用new/delete关键字动态调整/释放大小。数组是在编译时静态定义的,并且将始终占用该内存量。“它的大小可以在编译时确定。”-这应该是“不能”还是指非动态数组?顺便说一句,我一直认为
int(*pointerToFullArray)[10]=new int[10]代码应该在C++中被允许和要求。“它的大小可以在编译时确定。”-应该是“不能”还是指非动态数组?顺便说一下,我一直认为<代码> int(*PoTeToFulLARRY)[10 ] =新INT(10);。