二维数组指针传递 c语言,如何在C函数中传递指向二维数组的指针参数

如何在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

array[k] = malloc( M * sizeof(int) );

/ 方法二

#include

int ** array = malloc( N * sizeof(int

*) );

array[0] = malloc( M * sizeof(int) );

for (int k=1;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]。

posted on 2010-09-09 19:10 叶子 阅读(5489) 评论(1)  编辑 收藏 引用 所属分类: C\C++

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值