有趣的数组
单链表的逆转

二维数组做参数

yichen posted @ 2014年5月14日 16:44 in Essay , 566 阅读

 

二维数组做函数参数。首先说下函数的声明。

一、正确的声明方法:

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 );

 


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter