二维数组做参数
二维数组做函数参数。首先说下函数的声明。
一、正确的声明方法:
1.int function( int **array, int rows, int columns ); // func( (int**)array, 2, 5 );
2.int function( int array[3][5] ); // func( array );
3.int function( int array[][5] ); // func( array );
4.int function( int (*array)[5] ); // func( array );
注意:二维和高维不缺省
二、错误的声明方法:
1.int function( int array[][] );
2.int function( int array[3][] );
3.int function( int *array[5] );
三、当二维或多维数组做参数时,统统可以转化为一维数组做参数的情形。
Ex:
1.int function( int *a, int rows, int columns ); // func( (int*)array, 2, 5 );
2.int function( int a[], int rows, int columns ); // func( (int*)array, 2, 5 );
当访问数组内容的时候,可以按照数组在内存中的存储规则访问(按行依次存储)。如当为二维数组 int array[3][5],要访问 array[2][3] 时,可以写为 a[ 2*5 + 3 ];当为三维数组 int array[3][5][6],要访问 array[1][2][2] 时,可以写为 a[ 1*5*6 + 2*6 + 2] 。
四、实参的传入
函数声明的方法不同,对应传参方法也会大相径庭。
数组声明为 int a[][5] = {1,2,3,4,5,6,7,8,9,0};
函数调用实现见上//后内容。
五、总结
如果我们省略了数组的第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候往往需要用到各个维数
都不固定的二维数组作为参数,该如何办呢?这时我们可以不把它当作一个二维数组,而是把它当作一个一维数组的普通指针,再另外
加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我
们可以把维数固定的参数变为维数随机的参数。在转变后的函数中,array[i][j] 这样的式子是非法的,因为编译器不能正确的为它寻址,
所以我们需要模仿编译器的行为把 array[i][j] 这样的式子手工转变为
*( (int*) array + n*i + j );
然后,一切是显得那么祥和!^_^
最后,为了避免错误,我们可以将二维或高维数组做参数转换为一维数组做参数的情形。这也是基于多维数组在内存中的连续存储方式而可行!
综上可观,传入行参为指针是实用的,但要注意转换指针的类型1.int function( int **array, int rows, int columns ); // func( (int**)array, 2, 5 ); 2.int function( int *a, int rows, int columns ); // func( (int*)array, 2, 5 );