今天写程序时候要用到二维数组作参数传给一个函数.docxVIP

今天写程序时候要用到二维数组作参数传给一个函数.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
今天写程序时候要用到二维数组作参数传给一个函数

今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。?下文是我从互联网上download的一篇文章,讲的很好,但是我后面将指出问题所在,并加以改进,希望对你有所帮助:?首先,我引用了谭浩强先生编著的《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 im 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);?其实多维数组与二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。?上文结束,上文最后指出了实现二位数组作为函数参数的方法,但是它实现的是将静态的二位数组作为参数,但是如何将动态而为数组作为参数呢?上面的方法显然是不合适的,下面是我琢磨出来的方法。?先将静态数组作为参数的代码贴出来:#include iostreamusing namespace std;void Calc(int **A, int m, int n);int _tmain(int argc, _TCHAR* argv[]){ int row = 0; int col = 0; int i = 0; int A[3][3];? for (row = 0; row 3; row++) { for (col = 0; col 3; col++) { A[row][col] = row + c

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档