如何在C++中动态建立二维数组(转)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何在C++中动态建⽴⼆维数组(转)
C++中⽤new动态创建⼆维数组的格式⼀般是这样:
TYPE (*p)[N] = new TYPE [][N];
其中,TYPE是某种类型,N是⼆维数组的列数。

采⽤这种格式,列数必须指出,⽽⾏数⽆需指定。

在这⾥,p的类型是TYPE*[N],即是指向⼀个有N列元素数组的指针。

还有⼀种⽅法,可以不指定数组的列数:
int **p;
p = new int*[10]; //注意,int*[10]表⽰⼀个有10个元素的指针数组
for (int i = 0; i != 10; ++i)
{
p[i] = new int[5];
}
这⾥是将p作为⼀个指向指针的指针,它指向⼀个包含10个元素的指针数组,并且每个元素指向⼀个有5个元素的数组,这样就构建了⼀个10⾏5列的数组。

当数组使⽤完毕,释放空间的代码是:
for(int i = 0; i != 5; i++)
{
delete[] p[i];
}
delete[] p;
处理⼆维数组,可以⽤降维或是⼆维法。

降维法是⽤⼀位数组来接受⼆维数组,将⼆维元素的⾸地址&a[0][0]作为参数,传递给函数,函数⽤int *接受。

⼆维法就直接⽤⼆维数组来接受,但是需要指定列数。

double **data;
data = new double*[m]; //设置⾏或直接double **data=new double*[m]; ⼀个指针指向⼀个指针数组。

for(int j=0;j<m;j++)
{
data[j] = new double[n]; //这个指针数组的每个指针元素⼜指向⼀个数组。

}
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
data[i][j]=i*n+j;//初始化数组元素
}
}
for (i=0;i<m;i++)
{
delete[] data[i]; //先撤销指针元素所指向的数组
}
delete[] data;
/*这种⽅法是通过先动态创建⼀个指针数组,然后为指针数组的每个元素再动态指向⼀个数组的办法来完成的。

其创建过程与销毁过程两样重要。

在销毁的过程,先销毁指针数组每个元素指向的数组,然后再销毁这个指针数组。

*/————————————————————————————————————————————————————————————————————————————————————————— ⾸先:为什么需要动态定义数组呢?
这是因为,很多情况下,在预编译过程阶段,数组的长度是不能预先知道的,必须在程序运⾏时动态的给出
但是问题是,c++要求定义数组时,必须明确给定数组的⼤⼩,要不然编译通不过
如: int Array[5];正确
int i=5;
int Array[i]; 错误因为在编译阶段,编译器并不知道 i 的值是多少
那么,我们该如何解决定义长度未知的数组呢?
答案是:new 动态定义数组
因为new 就是⽤来动态开辟空间的,所以当然可以⽤来开辟⼀个数组空间
这样,下⾯的语句:
int size=50;
int *p=new int[size]; 是正确的
但是⼆维动态数组能不能也这样定义呢
int size=50,Column=50;
int (*p)[Column]=new int [size][Column]
这样的语句,编译器通不过,为什么呢?
⾸先 new int[size][Column] 就是动态⽣成时确定的,所以它没有错
那么就是 int(*p)[Column],这句有问题了,这句为什么不对呢,那是因为,这是⼀个定义语句,⽽定义语句先经过编译器进⾏编译,当编译器运⾏到此处时,发现Column
不是常数,因此不能通过编译。

⽽之所以编译器认为Column 不是常数,是因为编译阶段,编译器起的作⽤是查语法错误,和预分配空间,它并不执⾏程序,因此,没有执⾏那
个赋值语句(只是对这个语句检查错误,和分配空间),因此编译阶段,它将认为column 是个变量。

所以上⾯的⼆维数组定义是错误的,它不能通过编译。

改成这样:
int size=50
int (*p)[50]=new int [size][50]
便正确了。

由此可见,这种动态分配数组,仅对⼀维数组空间是真正动态分配的。

但是如何真正的动态分配⼆维数组呢,即如果Column 也不能预先知道的话,该如何处理呢?
上⾯的动态分配已经不能满⾜我们的要求,因为上⾯动态分配只对⼀维数组是真正动态的,对⼆维数组的话,必须编译之前预先知道⼆维数组每⼀列的长度,⽽这个长度在很
多情况下是不能预先知道的,所以我们得结合其他⽅法来解决这个问题。

既然⼀维是真正的动态分配的话,那我们利⽤这⼀特性定义⼀个指针数组。

int **p= new int*[size];//定义指针数组
int *p[5];// 假若知道⼆维数组的⾏数为5
然后对指针数组中的每⼀个指针分配⼀个⼀维数组空间,这样便动态定义了⼆维数组
事实上,我认为指针数组的主要⽤途,就在于动态定义多维数组
for(int i=0;i<size;i++)
{
p[i]=new int[Column];
}
运⾏完毕后,⼀个⼆维数组便被动态的成功建⽴
-----------------------------------
例⼦:
size =6;
column =5
int **p=new int*[size];
for(int i=0;i<size;i++)
{
p[i]=new int[Column];
}
所⽣成的动态数组如下图所⽰:
最后,因为调⽤了new, 千万千万别忘记在⽤完之后,将其所占资源 delete 掉
下⾯是delete⽅法:
for(int i=0;i<size;i++)
{
delete [] p[i]; // 要在指针前加[] ,否则的话只释放p[i]所指的第⼀个单元所占的空间 }
delete [] p; //最后不要忘掉释放掉开辟的指针数组:》。

相关文档
最新文档