对博主的其他文章感兴趣的请移步到 【CSDN文章】博客文章索引。
一、描述
同样的语句在Dev上允许编译通过,而在VS上则会提示“[ ]”内必须有常量值。这是因为不同的编译器对C++的支持不同。当我们需要在VS创建动态数组时,就要借用new动态创建数组了。
int n = 10;
int array[n];
动态数组的定义:数组的维度可以为常量、也可以为一个函数的返回值。
int size()
{
return 3;
}
const int length = 3;
int *p1 = new int[size()]{1,2,3};
int *p2 = new int[length];
int *p3 = new int[3];
二、一维和二维动态数组
仅以C++new和delete为例,malloc和free是同样的道理。
创建一维动态数组:
int* arr1 = new int[n]; // 已经分配内存,未初始化
for (int i = 0; i < n; ++i) {
arr1[i] = count++;
cout << arr1[i] << ' ';
}
cout << endl;
创建二维动态数组:
int row = 5, col = 4; // 行列
int** arr10 = new int* [row]; // 创建二级指针数组(指向堆上大小为row的一级指针数组)
for (int i = 0; i < row; ++i) {
arr10[i] = new int[col]; // 指针数组的一级指针指向大小为col的数组
}
for (int i = 0; i < row; ++i) { // 赋值
for (int j = 0; j < col; ++j) {
arr10[i][j] = count++;
cout << arr10[i][j] << ' ';
}
cout << endl;
}
三、完整代码
# include <iostream>
using namespace std;
int main()
{
// 一维数组
cout << "一维数组:" << endl;
int n = 10;
//int arr[n]; // 报错
int count = 1;
int* arr1 = new int[n]; // 已经分配内存,未初始化
int* arr2 = new int[n](); // 初始化为0
int* arr3 = new int[5] {1, 2, 3, 4, 5}; // 给定初始值
for (int i = 0; i < n; ++i) {
arr1[i] = count++;
cout << arr1[i] << ' ';
}
cout << endl;
// 二维数组
cout << "二维数组:" << endl;
int row = 5, col = 4; // 行列
int** arr10 = new int* [row]; // 创建二级指针数组(指向堆上大小为row的一级指针数组)
for (int i = 0; i < row; ++i) {
arr10[i] = new int[col]; // 每个一级指针数组指向大小为col的数组
}
for (int i = 0; i < row; ++i) { // 赋值
for (int j = 0; j < col; ++j) {
arr10[i][j] = count++;
cout << arr10[i][j] << ' ';
}
cout << endl;
}
//delete[]arr1, []arr2, arr3, arr10; // 报错
// delete[]arr1, arr2, arr3, arr10; // 编译通过,但是只能释放arr1
delete []arr1;
delete []arr2;
delete []arr3;
delete []arr10; // 手动释放开辟的空间
system("pause");
return 0;
}