如何将二维数组(静态的和动态的)作为函数的参数传递

本文介绍了如何处理二维数组作为函数参数传递的问题。在C语言中,必须指定所有维数大小或省略第一维,但不能省略第二维。通过使用两个额外的参数来表示维度,并手动进行寻址,可以实现二维数组的灵活传递。文章提供了将静态二维数组和动态二维数组作为参数的示例代码,展示了如何在函数内部正确操作这些数组。
摘要由CSDN通过智能技术生成



  今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不至于再在这上面浪费时间。


      下文是我从互联网上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 && i<m && 0<=j && j < n),编译器是这样寻址的,它的地址为:


  p + i*n + j;


  从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值