1.传递数组指针
1 #include <stdio.h> 2 void output( int (*pa)[3], int n )//这个函数只能输出n行3列的二维数组 3 { 4 int i,j; 5 for( i=0;i<n;i++ ){ 6 for( j=0;j<3;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int a[2][3]={ 14 {1,2,3}, 15 {4,5,6} 16 }; 17 output(a,2); 18 }
2.传递“指针数组” 先将二维数组的行指针存储到一个指针数组中,再将指针数组传递到子函数中去
1 #include <stdio.h> 2 void output( int *pa[], int row,int col ) //这个函数更通用,但调用前,要做好准备工作。 3 { 4 int i,j; 5 for( i=0;i<row;i++ ){ 6 for( j=0;j<col;j++ ) 7 printf("%d ", pa[i][j] ); 8 printf("\n"); 9 } 10 } 11 void main() 12 { 13 int a[2][3]={ 14 {1,2,3}, 15 {4,5,6} 16 }; 17 int i; 18 int *pa[2]; 19 for( i=0;i<2;i++ ) 20 pa[i]=a[i]; 21 output(pa, 2, 3); 22 }
对于二维数组作为变量存在于函数中,有如下情况:
void Func(int array[3][10]); void Func(int array[][10]); void Func(int(*array)[10]);
如果要取p[i][j]的值,编译器是这样寻址的,它的地址为: p + i*n + j; void Func(int array[3][10]); void Func(int array[][10]); 变为: void Func(int **array, int m, int n); 在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子手工转变为: *((int*)array + n*i + j); 在调用这样的函数的时候,需要注意一下,如下面的例子: int a[3][3] = { {1, 1, 1}, {2, 2, 2}, {3, 3, 3} }; Func(a, 3, 3); 根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用: Func((int**)a, 3, 3);
时间: 2024-10-25 08:15:48