int data[3][4]= {{1,2,3,4},{1,2,3,4},{1,2,3,4}};
定义了一个三行四列的数组
这个二维数组可以解释为:
有3个指向数组的指针, 每个指针指向一个 数组, 每个数组包含 4 个int 元素.
假如此时有一个sum 函数, 作用是计算这个二维数组的和
那么调用sum函数时, 代码应为 sum( data , int size);
那么 sum函数的原型是什么呢:
原型如下: (原型即函数的定义)
int sum(int (*ar2)[4] , int size );
为什么将二维数组作为形参时, 只有第一个方括号需要用符号表示, 而第二个方括号用具体的常量表示呢?
原因如下:
当 代码写出int data[3][4]时, data就会被认为是一个数组的指针, 指向一整个含有四个元素的数组. 这样的数组共有3个
当理解了上面的这两句话之后, 就可以理解为什么sum需要这样调用了
ar2 是一个指向数组的指针, data也是指向数组的指针, 所以调用sum函数时, 可以直接传递data作为实参 , size 就是data数组的长度, 就是3
其中, 括号不能少, 如果少加一个括号, 变为 int *ar[4] 代码的意义将有很大的改变, 此时代码的意义为:
只有一个数组, 这个数组的内容是 四个 int* 指针.
可以形象的理解为 | int* | int* | int* | int* |
而int (*ar2)[4] 的意思为:
| 含有四个int元素的数组 | 含有四个int元素的数组 | 含有四个int元素的数组 | 含有四个int元素的数组 |
为了更加便于理解, 可以将int sum(int (*ar2)[4] , int size ); 改写为
int sum(int ar2[][4] , int size );
这样写的可读性更强. 可以轻松的理解为, 这是一个二维数组, 只是行数没有指定, 值为空, 数组名为ar2, 而数组的实际长度, 需要由size 指定.
但是不论哪一种写法 , 他们都有相同的意义:
ar2是指针, 而不是数组 !