我们都知道C和C++中在传递一维数组时,,都将被编译器视为指针类型。如:
-
- void func( int* );
- void func( int[] );
- void func( int[ 10 ] );
所以传递一个指针实参给一维数组参数是可行的。
而且,当编译器对实参类型进行参数类型检查时并不检查一维数组的长度,也就是说数组的长度与参数声明无关。
那么上升为多维数组的情况,多维数组参数也将会被编译器视为指针的指针(或者说指针数组)吗?
当然不是,当函数参数是多维数组时,这样的参数必须指明第一维以外的所有维的长度。例如:
- void func( int matrix[][10], ...);
-
- void func( int (*matrix)[10] );
我们可以看到,二维数组的将会被编译器视为数组指针,而非指针的指针或者指针数组。
这也就是为什么我们经常需要传递一个二维数组参数时误传了一个指针的指针或使得编译器报错的原因。
最后来总结一下:
****************************************************************************************************
实参 所匹配的形式参数
数组的数组 char c[m][n] char(*)[n] -> 数组指针
指针数组 char *c[n] char **c -> 指针的指针
数组指针 char (*c)[n] char (*c)[n] -> 不改变
指针的指针 char **c; char **c -> 不改变
*************************************************************************************************** */