1.二维数组的储存是线性的,可以通过一维指针的方式访问。
如一下代码:
int map[5][5] = {
1,2,3,4,5,
5,4,3,2,1,
-1,-2,-3,-4,-5,
-5,-4,-3,-2,-1,
-2,-1,0,1,2
};
int *mapd = & map[0][0];
则 map[i][j] == mapd[i*5+j];
而利用二维数组线性存储的特性,可以将二维数组当作一维指针方便的在函数之间传递
如:将一个二维数组赋值给一个动态二维数组,参数设置为一维指针
void fun( int* map, int width , int height )
{
// copy
for( usigned inti=0 ; i< width ; i++ ){
memcpy( mapd[i],map+i * height ,sizeof( _byte ) * height );
}
}
fun( &map[0][0],5,5 );
2.通过二维指针分配的内存单元,并不一定是线性的,因而无法用二维数组的方式进行访问。
int** map = ( int** ) malloc ( sizeof( int ) * n * n )
这样的代码将会产生恶劣的后果。生成的动态二维数组根本无法访问。
推荐的方法是以循环来分配/释放每一个子数组的空间,即
// alloc map = new int * [mWidth]; for( usigned int i=0 ; i< mWidth; i++ ) { map[i] = new int [mHeight]; };