【C语言】关于二维数组作为函数参数的问题


在构建过二维数组作为函数的参数时遇到了一个问题。首先,我们看一个函数:

void func1(int **array, int m, int n)
{
 int i = 0, j = 0;
 
 for ( i = 0; i < m; i++ )
 {
   for ( j = 0; j < n; j++ )
   {
     //printf("%d ", array[i][j] );
     printf("%d ", *(*(array+i)+j) );  
   }
 }
}

函数设计的功能很简单,就是打印输出二维数组中的所有元素。

假如我们的主函数为:

int main(void)
{
 int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };

 func1((int**)a, 3, 3); 
 
 return 0;
}

大家觉得输出结果会是什么呢?结果是什么都没输出。出错原因是因为二维数组作为函数参数时要给出二维长度。但是,是不是就不能使用这个函数了呢?还是可以使用的,只要在主函数中定义一个指针数组作为中间桥梁即可正确输出。即主函数修改为如下所示:

int main(void)
{
 int a[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
 int *p[3];
 
 p[0] = &a[0][0];    //a[0]
 p[1] = &a[1][0];    //a[1]
 p[2] = &a[2][0];    //a[2]
 func1(p, 3, 3); 
 
 return 0;
}         

定义一个指针数组,该指针数组中的元素分别指向每一行的第一个元素。再把该指针数组作为形参传入func1函数中。

除此之外,还有如下三种方法构造函数:

(1)形参声明为一级指针

void func2(int *array, int m, int n)
{
 int i = 0;
 
 for ( i = 0; i < m*n; i++ )
 {
   printf("%d ", array[i]);
 }
}

(2)形参给出二维长度

void func3(int array[][3], int len)   
{
 int i = 0, j = 0;
 
 for ( i = 0; i < len; i++ )
 {
   for ( j = 0; j < 3; j++ )
   {
     printf("%d ", array[i][j]);
   }
 }
}

(3)形参声明为指向数组的指针(数组指针)

void func4(int (*array)[3], int len)
{
 int i = 0, j = 0;
 
 for ( i = 0; i < len; i++ )
 {
   for ( j = 0; j < 3; j++ )
   {
     printf("%d ", array[i][j]);
   }
 }
}

以上代码关于二维数组作为函数参数时,函数的定义方法。欢迎转发!



文章作者: 杂烩君
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 杂烩君 !
  目录