动态数组可以有两种使用方式:
1:不能预先知道数组的大小使用动态数组
传统数组(静态数组)是需要在程序运行前,就指定大小,比如说
int i = 10;
int a[i];
这种就是不合法的。
因为函数栈的要求,就是在函数运行前,分配好所有变量的空间,i是不定的,所以不能再运行前,就分配好空间。
但是大多数情况,我们并不能预先知道数组的大小的。
所以我们使用动态数组
int *a = new int[i];
这个语句就可以在执行的时候,才分配空间,是合法的。
2:大数组存储时栈区是有大小限制
传统数组是存放在栈区的,栈区是有大小限制的,如果你申请了一个大于2M的数组,程序就会报错……
但是动态数组是在堆空间的,理论上,内存有多大,就可以申请多大的数组。
在vc中栈默认是1M;有时创建一个a[1000000000]甚至更长的数组时栈会不够用,与此同时,即使数组不是太大,例如a[1000000],一次申请连续的数组会造成资源的浪费,并且可能因为很多因素内存的分配不能进行,而得不到内存。所以动态数组可以最大的限度节省内存空间。
一维动态数组的创建和删除
int *p = 0;
p = new int[10];//创建
delete [] p;
二维动态数组的创建和删除,以创建一个二维矩阵为例
double **data =0;//定义一个二维的指针
data = new double *[rsize]; //创建矩阵的行
for (int i = 0; i < rsize; i++)
{
data[i] = new double[csize]; //data[i] 此时是指针,创建矩阵的列
}
for (int i = 0; i < rsize; i++)
for (int j = 0; j < csize; j++)
data[i][j] = 0; //初始化
/*****二维动态数组删除****/
for (int i = 0; i < y; ++i)
{
delete p[i];//释放内存。
p[i] = NULL;//释放空间后将p[i]指向NULL值,
}
delete []p;
p = NULL;
new出来的数组它的逻辑地址(虚拟地址)是连续的,所以可以用遍历来读取,但物理地址是不一定的(因为要大数组存储,这个是操作系统的事情,用户不用关心)。