C语言中如何将二维数组作为函数的参数传递

转载 2015年07月09日 11:06:09
今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。 

正文: 


   首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何 

将二维数组作为参数传递,原文如下(略有改变,请原谅): 


   [原文开始] 

     可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: 

     void Func(int array[3][10]); 

     void Func(int array[][10]); 

     二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的: 

     void Func(int array[][]); 

     因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的: 

     void Func(int array[3][]);实参数组维数可以大于形参数组,例如实参数组定义为: 

     void Func(int array[3][10]); 

     而形参数组定义为: 

     int array[5][10]; 

     这时形参数组只取实参数组的一部分,其余部分不起作用。 

   [原文结束] 

   大家可以看到,将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。大家在学编译原理这么课程的时候知道编译器是这样处理数组的: 

   对于数组 int p[m][n]; 

   如果要取p[i][j]的值(i>=0 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为: 

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

   其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一 个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数 也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。

c语言一维数组做参数传递给函数:

今天碰到了一维数组做函数参数的问题,那就扒一扒这个问题: 首先抛结论: 1:C语言中,当一维数组做函数参数时,编译器总是把它解析成一个指向其首元素的指针。 2:实际传递的数组大小与函数形参指定的数...
  • tianjizheng
  • tianjizheng
  • 2015年06月01日 17:55
  • 14855

C/C++二维数组的参数传递与二维指针

在进行函数参数传递的时候,常常需要把一组数据传递给函数,我们知道一维数组在进行函数参数传递的时候,以数组名作为形参就可以,因为数组名就表示该数组的首地址,在函数内部也直接可以用[]符号访问。 那么二维...
  • u013752202
  • u013752202
  • 2015年11月06日 23:06
  • 5454

C++多维数组作为函数参数该怎么写?

众所周知,函数参数中一维数组的长度会被忽略的,但二维数组的第二维度就会被要求指定长度(否则gcc会报告“数组元素的类型不完全”)。这很好理解,它是为了让函数知道矩阵的宽度。同理,三维数组就会被要求指定...
  • Frank_Jay
  • Frank_Jay
  • 2017年02月27日 22:29
  • 1311

转:C语言中如何将二维数组作为函数的参数传递

转自:http://hi.baidu.com/outsmile/blog/item/38db95ede27206d2b31cb11d.html  今天写程序的时候要用到二维数组作参数传给一个函数...
  • u014426028
  • u014426028
  • 2015年08月18日 09:33
  • 163

转:C语言中如何将二维数组作为函数的参数传递

转:C语言中如何将二维数组作为函数的参数传递 转自:http://hi.baidu.com/outsmile/blog/item/38db95ede27206d2b31cb1...
  • Geek_sun
  • Geek_sun
  • 2017年11月20日 18:09
  • 49

C语言中如何将二维数组作为函数的参数传递

 转自:http://hi.baidu.com/outsmile/blog/item/38db95ede27206d2b31cb11d.html  今天写程序的时候要用到二维数组作参数传给一个...
  • wuli2496
  • wuli2496
  • 2015年07月18日 11:15
  • 428

C语言中如何将二维数组作为函数的参数传递

转自:http://hi.baidu.com/outsmile/blog/item/38db95ede27206d2b31cb11d.html  今天写程序的时候要用到二维数组作参数传给一个函数,我...
  • haizhongyun
  • haizhongyun
  • 2012年07月09日 15:56
  • 10302

C语言中如何将二维数组作为函数的参数传递

小知识点,二维数组
  • Jing_Laura
  • Jing_Laura
  • 2017年11月22日 16:07
  • 60

C语言中将二维数组作为参数传递给函数的方法

C语言中将二维数组作为参数传递给函数的方法 二维数组的函数参数传递的问题,以前解决过好几次,总还是忘记,这回总结出来写在这里。   #include /**********...
  • CSDNMicrosoftCSDN
  • CSDNMicrosoftCSDN
  • 2013年06月17日 16:14
  • 815

二维数组作为函数参数传递剖析(C语言)(6.19更新第5种)

前言   很多文章不外乎告诉你下面这几种标准的形式,你如果按照它们来用,准没错: //对于一个2行13列int元素的二维数组 //函数f的形参形式 f(int daytab[2][13]) {.....
  • wuyuegb2312
  • wuyuegb2312
  • 2013年06月14日 17:17
  • 1253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中如何将二维数组作为函数的参数传递
举报原因:
原因补充:

(最多只允许输入30个字)