查看原文
其他

【易错】C语言二维数组作为函数参数?

正念君 嵌入式大杂烩 2021-01-31


大家有构建过二维数组作为函数的参数吗?有没有遇到什么问题呢?现在,我们先来看一个函数:

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


以上代码可在后台回复关键字:ZN03获取


推 荐 阅 读

01 二维数组作为函数参数

02 小学生都在使用手机学习编程了,你还在吃鸡打王者?

03 别用Visua C++6.0来开发C程序了,用……

04 使用Notepad++来开发C程序

05 关于main()

06 一份通俗易懂的C语言内存总结

07 数组问题:a与&a有什么不同

08 C语言函数参数压栈的顺序是?

09 getchar()、getche()、getch()的区别?

10 【校招编程01】级数求和

11 【校招编程02】优雅的点

12 【校招编程03】整数翻转

13 【校招编程04】懂二进制

14 【校招编程05】找符合条件的数

15 程序员的桌面,好酷!!!



【每日一句】

一万小时的锤炼是任何人从平凡变成非凡的必要条件。



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存