在平时的编程过程中,我们经常会用到数组来存放数据,我们可以直接申请足够大空间的数组来保证数组访问不会越界,但是即便这样,我们依然不能保证空间分配的足够,而且非常的浪费空间。有时候我们需要根据上面得到的值,或者手动输入的值来分配数组的大小,很多人都会用cin>>n;int a[n];这样是不对的,因为int a[n]是在编译阶段就要确定的,这个时候n不是个常量,编译器不知道如何分配,会报错。
所以我们需要动态申请数组
1、一维数组a[n]
(1)用malloc申请
int* a =(int*) malloc(n*sizeof(int));这样就动态申请了一个一维的a[n]的数组,具体的语法,主要应注意void*到int*的强制转换,以及malloc本身是不调用构造函数的,所以如果是自定义类型,不能用malloc申请。
(2)用new申请
int* a = new int[n];
(3)用STL中的vector来申请
vector类似于数组,但功能比数组强大,鉴于vector的特性,我们可以事先不指定大小,可以直接pushback
2、二维数组a[m][n]
(1)用malloc申请
a = (int**)malloc(sizeof(int*)*m);这里首先开辟二维数组的行,接着再开辟二维数组的列
for(int i = 0;i < m; i++)
{
*(a+i) = (int*)malloc(sizeof(int)*n);
}
(2)用new申请
同样是先开辟行,int** p = new int*[m];然后开辟列
for(int i = 0;i < m; i++)
{
a[i] = new int [n];
}
for(int i = 0;i < m; i++)最后释放空间资源
delete[] a[i];
delete[] a;
(3)用vector来实现
vector<vector<int> > a(m,vector<int>(n));
这里要注意的是int后面的两个>要有空格,否则会被认为是重载<<,还有后面的列要用vector<int>(n)