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