动态数组参数

来源:互联网 发布:g是什么意思网络用语 编辑:程序博客网 时间:2024/05/04 16:53
Q :关于二维数组作为函数的参数的问题。主要解答者:liem提交人:naturemickey感谢:mylove0618、liem、lw1a2、idau7、pcboyxhy审核者:Polarislee社区对应贴子:查看     A :


例如: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){
      // 行基址+(列个数*行数)+列数
}