C++ 函数与二维数组

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是指针, 而不是数组 !

 

posted @ 2019-02-27 19:39  Derek丶D  阅读(1998)  评论(0编辑  收藏  举报