构造以二维数组为参数的通用接口

本文探讨如何创建一个适用于所有二维整数数组的通用接口。通过分析二维数组的内存布局,提出两种解决方案:A方法直接使用二级指针传递,B方法利用数组地址计算。这两种方法分别进行了详细解释。
摘要由CSDN通过智能技术生成

问题由来:

int  a[3][4];  

//若要如此调用 func( a );
void  func(int  b[  ][4]);

因为函数形参的第二个[  ]中必须有数字,那么如何写一个对于所有int[  ][  ]都通用的接口呢?

问题分析:

严格来说,变量a不是(int  **)即二级指针类型,而是一个数组类型。  
定义  int  a[3][4]其实是与下面的定义方式是有相同效果的,即:  
 
typedef  int  arraySingleDegree[4];  
arraySingleDegree      a[3];  
 
意思就是说:变量a是一个具有3个元素的数组,其中每个元素类型为一个一维数组(该一维数组具有4个元素,具体类型为int)。  

如果理解了二维数组,那么就可以很容易地和二级指针区别开来。  
二级指针变量的内容是一个一级指针变量的地址。由于一级指针变量可以指向任意长度一维数组的首地址,因此二级指针变量就不等同于任何一个二维数组。事实上,一个二维数组一旦定义,则其对应的伪类型即一维数组的长度就是确定的。  

问题解决:

有两个办法可以解决:

A:

int  ActionOnAnyDoubleDegreeArray( int  **  ppAddr, int  iRow, int  iColumn );  

iRetVal  =  ActionOnAnyDoubleDegreeArray( (int  **)a, 3, 4 );  

B:

//  ppAddr[i][j] == ppAddr[ i*iColumn+j ]

int  ActionOnAnyDoubleDegreeArray( int  *  ppAddr, int  iRow, int  iColumn );

iRetVal  =  ActionOnAnyDoubleDegreeArray( &a[0][0], 3, 4 );  

总结:

A 方法比较直接 容易理解

B 方法比较巧妙

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值