例如:int a[3][4]; 把 a 做为参数传给一个函数:func(a), 只有此形式才没有问题:void func(int b[ ][4]); 可是若为如下形式:void func(int* b); 在DevCpp中有Error;在VC中有Warning,但可得到正确的结果。 这下就有问题了: (1). a 是一个int**型,但在VC中用int*型据然也能得到正确的结果(函数中的*(b + 2),VC理解为一个整数,且正是a[0][1]所对应的整数); (2).若要写一个对于所有int[ ][ ]都通用的接口似乎是不可能的,因为函数形参的第二个[ ]中必须有数字。 这个(2)是我想问的关键问题,如何写一个通用的接口(例如:对于int[ ][ ])? --------------------------------------------------------------- 严格来说,变量a不是(int **)即二级指针类型,而是一个数组类型。 定义 int a[3][4]其实是与下面的定义方式是有相同效果的,即: typedef int arraySingleDegree[4]; arraySingleDegree a[3]; 意思就是说:变量a是一个具有3个元素的数组,其中每个元素类型为一个一维数组(该一维数组具有4个元素,具体类型为int)。 如果你对上面的话不是很理解的话,可以将一维数组想象为一个结构体,这样的话,一个二维数组其实就相当于一个“结构体”数组,只不过这里的结构体是一个数组而已。 事实上,结构体和一维数组在物理存储上可以视为是没有差别的。上面的一维数组类型arraySingleDegree就相当于一个如下的结构体变量定义: typedef struct TagArrayAsStruct { int iItem1; int iItem2; int iItem3; int iItem4; }ArrayAsStruct; 类比思考一下,可以有助于你对二维数组的理解。 如果理解了二维数组,那么就可以很容易地和二级指针区别开来。 二级指针变量的内容是一个一级指针变量的地址。由于一级指针变量可以指向任意长度一维数组的首地址,因此二级指针变量就不等同于任何一个二维数组。事实上,一个二维数组一旦定义,则其对应的伪类型即一维数组的长度就是确定的。 所以如果需要对任意二维数组进行操作,就需要定义类似下面的一个接口: int ActionOnAnyDoubleDegreeArray(int ** ppAddr, int iLengthOfDegreeOne, int iLengthOfDegreeTwo); 一家之言,仅供参考,欢迎指正。 --------------------------------------------------------------- 你要将a传入接口ActionOnAnyDoubleDegreeArray中吗?这样调用: iRetVal = ActionOnAnyDoubleDegreeArray((int **)a,3,4); --------------------------------------------------------------- 通用接口用一级指针,加行列数 void f(int *x,int row,int col); 调用时: 设有int a[3][4],则 f(&a[0][0],3,4) a[i][j]=>x[i*col+j]
---------------------------------------------------------------- 首先你要知道二维数组其实有两种. 第一种是连续空间的. 第二种是行索引列的. 1, int* matrix=new int[20*20]; // 20行20列 matrix[20*10+2]=90; // 实际就是matrix[10][2]; 2, int** matrix=new int*[20]; for(int i=0; i<20; i++) matrix[i]=new int[20]; int** p=matrix; matrix[10][2]=90; 第一种用foo(int* p, int row, int col); 第二种用foo(int** p, int row, int col); / // Exp. / class Widget{ public: void Compute(int* _matrix unsigned int i, unsigned int j); private: unsigned int _row; unsigned int _col; };
void Widget::Compute(int* matrix unsigned int i, unsigned int j){ // 行基址+(列个数*行数)+列数 }
|