最近在写一个扫雷游戏,需要一个动态的二维数组来保存雷的状态。所以有了这篇文。
以一个int mine[5][7]二维数组举例。
这个二维数组可以这么理解
*mine - *(mine+5) 分别指向 一块内存大小为 7*sizeof(int)的内存块.
所以可以先为mine分配一个 5*sizeof(int) 的内存块.
然后为*mine - *(mine+5) 分别申请一块内存块。
int **mine = (int **)new int[5];
for (int i = 0; i < 5; i++)
{
*(mine+i) = new int[7];
}
但是这种内存分配方式每次都需要耗费时间去开辟空间。
看看下面这种方法
int **mine = (int **) new int[5]
*mine = new int[5*7];
for(int i = 0; i < 5; i++)
{
*(mine+i) = *mine + i*7;
}
这种方法首先开辟一块存放mine[0] ~ mine[4]的内存。再开辟一块总内存,然后把mine[0] ~ mine[4]分配指向相对应的7*sizeof(int)内存大小的内存块。
而且用这种方法开辟的内存空间是连续的。
更多维的数组的原理也是这样。
举一个三维的例子。
p[1][2][3]
int ***p;
int i,j,k;
p = (int ***) new int;
*p = (int **) new int[1 * 2];
**p = new int [1 * 2 * 3];
for (i = 0; i < 2; i++)
{
*(p+i) = *p + i * 2;
for (j = 0; j < 3; j++)
{
*(*(p+i)+1) = *(*p) + j * 2;
}
}
另外注意一点的是,在内存上是不存多维数组的,因为内存条的存储方式是线性存储方式。
以二维数组为例可以这么解释
在数组m[n]的每个元素中都分别指向m块内存.
可能说的有些拗口。能理解的就看看吧。有什么说错的也希望大家帮忙改正。