动态数组可以有两种使用方式:

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出来的数组它的逻辑地址(虚拟地址)是连续的,所以可以用遍历来读取,但物理地址是不一定的(因为要大数组存储,这个是操作系统的事情,用户不用关心)。

05-23 01:11
查看更多