【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]);
   }
 }
}

以上代码关于二维数组作为函数参数时,函数的定义方法。如有错误,欢迎指出~


我的个人博客:https://zhengnianli.github.io/

我的微信公众号:嵌入式大杂烩

[](


 上一篇
【C语言笔记】关于有符号数与无符号数的一些总结 【C语言笔记】关于有符号数与无符号数的一些总结
1、有、无符号数之间的运算有符号数与无符号数之间的运算,编译器会进行隐式类型转换。 请看如下代码: #include <stdio.h> int main(void) { unsigned int a = 6; int
2018-10-30
下一篇 
【C语言笔记】static关键字 【C语言笔记】static关键字
参考:https://blog.csdn.net/keyeagle/article/details/6708077?utm_source=copy C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变
2018-10-25
  目录