二维数组与二维指针

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]; };





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值