如何在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
// 必须包含该头文件,里面定义了
malloc的实现
int ** array = malloc( N * sizeof(int *) );
for (int k=0;k
int ** array = malloc( N * sizeof(int *) );
array[0] = malloc( M * sizeof(int) );
for (int k=1;k
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
》上面的一
节原文,它简要介绍了如何
将二维数组作为参数传递,原文如下(略有改变,请原谅):
[原文开始]
可以用二维数组名作为实参或者形参,在被调用函数中
对形参数组定义时可以可以指
定所有维数的大小,也可以省略第一维的大小说明,如:
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
本文档为【如何在C函数中传递指向二维数组的指针参数】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。