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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Devops专栏

Python 可变参数 *args **kwargs 的再了解

可以从上面的结果来看,args可以把多余的数字放入一个元组中,而后面的则被kwargs放入字典中。

11340
来自专栏Devops专栏

JavaScript 超详细的字符串处理方法

18330
来自专栏Devops专栏

Python 闭包- 胖子老板:一包槟榔 + x 包蓝利群要多少钱

好了,通过上面的执行,可以知道函数的传递是使用这个方式的ret = pay1,也就是 变量1 = 函数1。

11650
来自专栏Devops专栏

JavaScript 变量

JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定。 定义变量需要用关键字 var

10430
来自专栏Devops专栏

JavaScript 循环语句 - for 、while 循环

这是采用indexOf()方法定位元素第一次出现的位置,然后与下标判断是否一致,如果一致,则加入到另一个数组中。

11950
来自专栏Devops专栏

Python import导入模块 - reload() 导入的内容

模块被导入后,import module不能重新导入模块,重新导入需用reload

24020
来自专栏Devops专栏

JavaScript 数组及操作方法

可以看出join()方法并不会改变aList数组本身的值,只会生成一个字符串而已。

10730
来自专栏Devops专栏

Python 实战使用 进程池 多进程 copy文件

那么从上面ipython的基本操作中,可以使用os模块获取需要拷贝的文件目录下的文件(不考虑还有子目录)为list数组。 然后遍历list数组来拷贝数据。

15330
来自专栏Devops专栏

Python 迭代器 - Iterable对象

迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

10820
来自专栏小强的进阶之路

你连Nginx怎么转发给你请求都说不清楚,还好意思说自己不是CRUD工程师?

Nginx由内核和模块组成,Nginx本身做的工作实际很少,当它接到一个HTTP请求时,它仅仅是通过查找配置文件将此次请求映射到一个location block...

11740

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励