如何在C函数中传递指向二维数组的指针参数.docVIP

如何在C函数中传递指向二维数组的指针参数.doc

  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文档。上传文档
查看更多
如何在C函数中传递指向二维数组的指针参数

前几日用C编写DSP程序时,遇到一个问题:如何向C函数中传递指向二维数组的指针参数。初接触以为很简单,直接声明一个二维数组,然后把数组名传进去。但是一经编译便报错。后来仔细想了一下,并查找了一些相关资料,发现二维数组在概念上远比一维数组复杂,或者说二维数组以一种晦涩的方式构建在一维数组之上。 先来回顾一下一维数组。一维数组的数组名即为指向该数组的指针,该指针值保存了数组存放在内存中的一块连续区域的起始地址;数组的下标表示了这片内存区域的某存储区相对于起始地址的偏移量。简单来讲就是:指向一维数组的指针,指向数据存放区域的起始位置。 事实上,计算机系统的多维数组其实最终还是以一维数组的形式实现的。就N x M的二维数组来讲,设其数组名为array。指针array指向一个数组,该数组存放的是一系列指针,这些指针分别指向相应的一维数组,而这些数组中存放的才是我们的数据。 array - [一维数组指针1] - ? [ 一维数组,M长] ? ? [一维数组指针2] - ? [ 一维数组,M长] ? ? ? ? …… ? ? ? ? ? …… ? ? [一维数组指针N] - ? [ 一维数组,M长] 由此array是第i个指针变量地址,array[j]则表示相对于第i个指针变量偏移j*sizeof(数组类型)。系统通过这种机制访问了该二维数组的第i行,第j列的内容。 有上述可知,指向二维数组的指针其实是指向“指针变量地址”的指针变量。所以在声明指向二维数组的指针时,用 int ** array的形式。 ? ? 有以下两种方式来对二维数组分配内存: ///// 方法一 ? ? #include stdlib.h ? // 必须包含该头文件,里面定义了malloc的实现 ? ? int ** array = malloc( N * sizeof(int *) ); ? ? for (int k=0;kN;k++) ? ? ? array[k] = malloc( M * sizeof(int) ); ? ///// 方法二 ? ? #include stdlib.h ? ? int ** array = malloc( N * sizeof(int *) ); ? ? array[0] = malloc( M * sizeof(int) ); ? ? for (int k=1;kN;k++) ? ? ? array[k] = array[0]+M*k; ? ? 上述两种方法的区别在于:前者在内存中分配的区域有可能是不连续的;而后者则在内存中的一片连续区域为该数组分配空间。 ? ? 我们还可以通过一维数组模拟二维数组。在这中间要进行下标转换。如对于模拟的NxM数组,访问其第i行,第j列元素时,在一维数组中对应的位置是i*M+j。当然为了更简捷,我们可以把这个数组下标转换过程定义为一个宏,交由编译系统来处理。 ? ? #define Arr2 ( array_name, row,col ) ? array_name[row*M+col] ? ? 定义该宏后,访问Arr2( array, i, j)等价于访问 array[i*M+j]。 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行 ? ? ? ? 传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍 ? ? ? ? 如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。 ? ? ? ? 正文: ? ? ? ? ? ? 首先,我引用了谭浩强先生编著的《C程序设计》上面的一节原文,它简要介绍了如何 ? ? ? ? 将二维数组作为参数传递,原文如下(略有改变,请原谅): ? ? ? ? ? ? [原文开始] ? ? ? ? ? ? ? ? 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指 ? ? ? ? 定所有维数的大小,也可以省略第一维的大小说明,如: ? ? ? ? ? ? void ? Func(int ? array[3][10]); ? ? ? ? ? ? void ? Func(int ? array[][10]); ? ? ? ? ? ? 二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是 ? ? ? ? 不合法的: ? ? ? ? ? ? void ? Func(int ? array[][]); ? ? ? ? ? ? 因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放), ? ? ? ? 而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多少列,不能 ?

文档评论(0)

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

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

1亿VIP精品文档

相关文档