有时候我们需要根据输入值动态地创建数组,C++和java中语法大致相似,略有些不同,在此记录一下。
一、C++动态创建数组
有直接声明和new关键字创建两种。
int m, n;
cin >> m >> n;
//1.直接声明
int a1[m];
int a2[m][n];
//2.用new关键字创建
//2.1 new创建一维数组,在这里可以直接有列表进行初始化,列表中
//有多少个参数就会初始化多少个数组元素,其余的数组元素不会被初始化
int* c1 = new int[m];
int* c2 = new int[m](); //两种方式不同见下面
int* c3 = new int[m]{1,2,3};
//2.2 new创建二维数组,其中二维数组不能用 int ** a = new int[m][n]
//需要用一下方式
int** b = new int*[m];
for (int i = 0; i < m;i++)
{
b[i] = new int[n];
// b[i] = new int[i+1]; 这里也可创建不同大小的第二维数组
}
}
//...
//释放内存
delete [] c1;
delete [] c2;
delete [] c3;
for (int i = 0; i < m;i++)
{
delete [] b[i];
}
delete [] b;
1. 直接声明的方式和new关键字创建的区别:
直接声明的方式创建动态数组时将数组分配到栈区,而new关键字则是将其分配到堆区,由程序员自己管理(详细可以看:C++内存分区)
2. 上面c1和c2声明方式的区别,就我目前的观察来看,没有什么区别,都是调用了默认的构造函数,默认构造函数和构造函数的区别,详见这里。
二、Java动态创建数组
Scanner scanner = new Scanner(System.in);
int m = scanner.nextInt();
int n = scanner.nextInt();
int [] c = new int[m];
int [][] a = new int[m][n];
int [][] b = new int[m][];
for(int i=0;i<m;i++)
{
b[i] = new int[i+1];
}
值得注意的是java是不能直接定义来创建动态数组的,因为就连java用常量定义数组都是需要用new来定义的,如下。
int [] c = new int[5];
int d[]= {1,2};
另外,java中没有暴露指针,所以不会有*符号,数组用[]标示,垃圾也会自动回收。
再者,java可以采用 new int[m][n]的方法创建第二维都相同(如都是n)的二维数组,而C++不行,会产生语法错误。