问题由来:
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 方法比较巧妙