ls几个真是太不负责任了, 想当然的int** ??
为什么不自己亲自try it ?
一般来说数组的传递方法应该是这种形式的
void function(type arrayName[][a][b]...[c]){
}
如果是一维数组 void F(type N[]) (简写)
二维 void F(type N[][a]) ,这里a是一个数
以此类推
lz这里就应该是void gaibian(int b[][2])
我们平时经常可以看到void F(type* N)这样的形式,用来传递数组。
然而实际上这只是种取巧的手段,因为数组某种程度上和指针是等价的。
上面那种形式的真正意义应该是“传递指针”。
应该再明确一点:
是数组的名字和指针变量的操作方式很相似。
譬如int a[10], 与 int* a;
都可以用 *(a+i) 与 a[i] 这两种索引方法
如果对于多维数组就不完全一样了
譬如int a[10][10]; int* b;
b=a;
那么 a[i][j] 与 b[10*i+j]是相等的。
因此lz的函数也可以改成这样子:
void gaibian(int* b)
{
b[0*2+0]=1;
b[0*2+1]=2;
b[1*2+0]=3;
b[1*2+1]=4;
}
编译可以通过, 但会受到一个警告“int *”与“int [2][2]”的间接级别不同
Whatever, 数组参数绝对不应该有type** 这种类型..
刚才看资料, 发现还有一种形式, 应该说更接近本质的形式
void function(type (*arrayName)[a][b]...[c]){
}
它与
void function(type arrayName[][a][b]...[c]){
}
不同之处就是arrayName[]换成了(*arrayName)
意思都差不多, 效果也差不多。
换个角度来看这个问题吧,一维数组的数组名实际上就是访问这个数组的入口指针,楼主给出的第一个示例代码中实际上就是将一维数组的入口指针作为参数传递给函数而已。二维数组相当于是一个存储着数组的数组,其数组名也一样是访问其的指针,只不过由于是指向(其内存储的)数组的指针,也就相当于是一个存储指针的指针,所以其类型就应当在一维数组的指针类型之上作一点变化,即从XX *p变为XX **p。楼主已经知道了怎样将一维数组作为参数传入函数,相信现在应该不难明白怎样传入二维或多维数组了。
void gaibian(int b[][])或者void gaibian(int **b)
参考此网址http://blog.chinaunix.net/u2/76292/showart_2018128.html