动态申请数组,在C/C++编程之中也算是比较常见的操作,动态申请一维数组相信列位也都能从书中找到,但对于动态申请二维数组,似乎书中甚少提及,不过没关系,看完本文之后我们对于这个操作也就能有个清晰的认识了。下面我们进入正文:
动态申请一维数组的方法很简单,我们都知道数组是一段连续的内存空间,所以只要我们拥有数组首地址,那我们就能对数组元素逐个访问,而数组名有时是被解释为数组首地址(指针)的,基于这个事实,我们就可以得到:
int *p_arr = new int[10]; //如此,我们就成功地动态申请得到了一维数组
//new操作返回数组首地址,用一个指针保存
有了上述的解释,或许有人就会进行以下的操作:
int **p_arr = new int[10][10]; //既然一维数组是一级指针
//那二维数组是否就是二级指针呢?
我们可以编译运行一下,然后我们就能看到问题了,不能将int(*)[]转换为int **。由此,我们就可以引出第一种动态申请二维数组的方法了:
#include "iostream"
using namespace std;
int main(int argc, char *argv[])
{
int (*p_arr)[4] = new int[4][4];
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
p_arr[i][j] = i * j;
}
}
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
cout << p_arr[i][j] << " " << ends;
}
}
return 0;
}
方括号中的值必须为二维数组第二维的值,虽然可以不是,但这将会引出一个比较麻烦的问题——按索引访问元素是,所得到的或许就不是我们期望的了,这点大家可以自己尝试一番。
下面我们介绍第二种二维数组的动态申请方法,第二种申请方法基于动态一维数组的申请,我们是将动态一维数组转换为二维数组,为何可行?只因为二维数组虽然物理结构像一张二维表一般,但其实实质还是一整段连续的内存空间的,与一维数组一样,所以我们就可以对其进行一定的转换,转换方法如下:
#include "iostream"
using namespace std;
int main(int argc, char *argv[])
{
int nRow, nCol;
cin >> nRow >> nCol;
int *p_arr = new int[nRow * nCol];
int (*pp_arr)[nCol] = (int(*)[nCol])p_arr;
for (int i = 0; i < nRow; i++)
{
for (int j = 0; j < nCol; j++)
{
pp_arr[i][j] = i * j;
}
}
for (int i = 0; i < nRow; i++)
{
for (int j = 0; j < nCol; j++)
{
cout << pp_arr[i][j] << " " << ends;
}
}
return 0;
} 看完上述两种方法,我们就差不多清楚地了解了动态二维数组的申请方式,此外,我们还有一个比较取巧的方式:我们可以先申请一个一维指针数组,然后再对其元素逐个进行申请数组空间,虽然这也可行,但我们并不推荐这样做,理由是,我们不能保证这个数组的连续性!失去了连续性的数组,那我们还不如去使用STL呢!