指针函数里的定义,迷糊解决方法

指针函数里的定义,迷糊
1.问问用指针声明的方式是不是基本上都用A这种形式?为什么不用void sum(int ar[][],int n);为什么前面学到的*(*p)[3]在后面的练习中根本用不上?那这个是时候用?
ar是个2维数组
#define ROWS 3
#define COLS 4
A.void sum(int ar[],int n);
  sum(
B.void sum(int m,int n,int ar[m][n]);
/////////////////////////////////////////////////////////////////////////

别看上面了。。问题根本没说清楚。因为我根本说不清楚。。。指针这章啊。。。反复看了几遍了。
函数定义里,是不是通过地址找值出来再计算的啊?


------解决方案--------------------
数组不能拷贝构造,所以函数参数里都不支持数组,只能使用引用或指针。

我们写代码时形如 void func( int h[4] ); 
前者仅仅代码上直观,但是没实质数组的意义的。
代码里有意义的是对指针类型的说明,而数组的长度是没意义的,会被忽略。
所以实际上void func( int h[] ); 或者void func( int * h );都是同一回事. 


void sum(int ar[ROWS][COLS],int rows); 编译器处理时,ROWS作为长度说明,是被忽略的。COLS作为指针说明则是有意义的。实际效果为
void sum(int ar[][COLS],int rows); //ar是一个 指向大小为COLS的int数组,ar+1就有计算的根据了.
或者void sum(int (*ar)[COLS],int rows);也可以

void sum(int ar[ROWS][],int cols);就是一个错误的写法了