前言

多维数组中,二维数组是最常用的一种。在C语言编程中,二维数组的定义、取值以及赋值都比较容易,与一维数组类似。然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解。本文章是实用型文章,注重代码使用,不会讲述过多理论。如果想要学习理论知识(非常推荐,可以对代码的理解更透彻),可以查阅下方参考文献列出书籍的第10章内容。话不多说,下面将给出一个C程序,以展示二维数组作为函数参数的4种方式。注:下面的代码已在VS Code(使用Mingw64)和VS 2015下编译运行过。

正文

下面程序的功能是对一个int型二维数组的所有元素进行求和,并分别把求和结果打印在屏幕上。根据二维数组传入函数的方式,定义了4个版本的求和函数。

#include <stdio.h>#define ROW 2   //二维数组的行数
#define COL 2   //二维数组的列数//4个版本的求和函数
//方式一:数组形式
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);//方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
int TwoDimArraySum2(int (*prArray)[COL], int row, int col);//方式三:指针形式,pr是一个指向int的指针
int TwoDimArraySum3(int *pr, int row, int col);//方式四:变长数组(C99开始支持)
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);int main(void)
{int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};int result;//方式一result = TwoDimArraySum1(twoDimArray, ROW, COL);printf("Sum1函数结果:%d\n", result);//方式二result = TwoDimArraySum2(twoDimArray, ROW, COL);printf("Sum2函数结果:%d\n", result);//方式三result = TwoDimArraySum3(twoDimArray[0], ROW, COL);printf("Sum3函数结果:%d\n", result);//方式四result = TwoDimArraySum4(ROW, COL, twoDimArray);printf("Sum4函数结果:%d\n", result);return 0;
}int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
{int i, j;int result = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){//下面两种寻址方式都行result += twoDimAr[i][j];// result += *(*(twoDimAr + i) + j);}}return result;
}int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
{int i, j;int result = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){//下面两种寻址方式都行result += prArray[i][j];// result += *(*(prArray + i) + j);}}return result;
}int TwoDimArraySum3(int *pr, int row, int col)
{int i, j;int result = 0;for (i = 0; i < row; i++){for (j = 0; j < col; j++){//下面两种寻址方式都行result += pr[i*col + j];// result += *(Pr + i*col + j);}}return result;
}int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
{int i, j;int result = 0;for (int i = 0; i < row; i++){for (int j = 0; j < col; j++){//下面两种寻址方式都行result += twoDimAr[i][j];// result += *(*(prArray + i) + j);}}return result;
}

正如程序注释所言,方式4(变长数组)是C99开始支持的,不是所有编译器都支持。例如,VS 2015就不支持该语法。因此,在VS 2015环境下运行时,方式4被注释了。下面给出VS Code(基于Mingw64)以及VS 2015环境下的运行结果。

左图为VS Code;右图为VS 2015

优缺点评价

这里先给出结论,最推荐使用方式3。下面是简要的分析。

  • 方式1和方式2实质上是相同的。它们适用性很好。但是,它们定义必须事先给出第二维的长度,即不是对任意大小的二维数组都适用。
  • 方式3适用性同样很好,对任意大小的二维数组都适用。但是,它是最难理解的。理解它需要对二维数组元素的结构、二维数组元素的储存以及二维数组与指针的关系有比较深刻的理解。
  • 方式4是最容易理解的了。但是,它的适用性最差。

最后需要强调的是,对于该程序的求和函数,更安全、更易读的写法是将参数列表中接受二维数组数据的参数加上const修饰。本程序没加的原因是为了更好的突出其功能。const修饰的对象不同,产生的效果也不同。如果参数列表中接受二维数组数据的参数加上const修饰,它将无法修改二维数组的数据;如果只有待传入的二维数组是用const修饰,参数列表中的参数不是const修饰的,那么上述方式都不被允许。因此,请根据实际情况,自行决定const的修饰对象和修饰位置。

关于更高维数组

对于更高维的数组,上面四种方式仍然适用。除了方式3外,另外三种方式都很容易扩展成更高维的。对于方式3,虽然最推荐它,但是它随着维数的增多,它变得更复杂更难理解。而且基于方式3,还可以延伸出其他方式。这里以三维数组举例,方式3还可以延伸出这样一种方式,该方式中接受三维数组的形参是一个指向一维数组的指针。对于这种由方式3延伸的方式,我是不推荐的,它比方式3更复杂,使用它还不如使用方式3。

参考文献

Stephen Prata写的《C Primer Plus》第五版

博主:虔诚~似锦(主博客)

个性签名:如果你愿意努力,人生最坏的结果也不过是大器晚成。

------------------------------------------------------------------------------------

如果这篇文章对你帮助的话,记得在下方点赞哦,博主在此感谢!

C语言 二维数组作为函数参数的4种方式相关推荐

  1. C语言 二维数组做函数参数的几种情况

    (1)       实参为数组元素地址,虚参为元素类型指针 (a)       调用函数:fun(*a,3*4);  //*a也可为a[0] or &a[0][0] 函数: fun(int * ...

  2. C语言 | 二维数组作为函数参数

    1024G 嵌入式资源大放送!包括但不限于C/C++.单片机.Linux等.关注微信公众号[嵌入式大杂烩],回复1024,即可免费获取! 偶然间发现C语言二维数组作为函数的参数是个比较容易出错的问题. ...

  3. C语言二维数组作为函数参数的使用

    c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. #include <stdio.h> void func(int n, char str ...

  4. 二维数组作为函数参数传递的三种方式

    指针 1.形参声明为二维数组 2.形参声明为一级指针 3.形参声明为二级指针 指针 关于指针的介绍和基础应用推荐一位B站up主的视频 [C指针]十分钟.你要是听不懂.我当场就把这个编译器- 1.形参声 ...

  5. C语言-二维数组做函数的参数

    文章目录 1 引例 2 观点1 这种使用方法是错误的 3 观点2 根本不需要这么做 4 二维数组做函数参数的方法 4.1 方法1 4.2 方法2 4.3 方法3 5 与Java的不同 1 引例 下面的 ...

  6. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  7. C语言二维数组作为函数参数传递

    二维数组存放方式 二维数组在内存中是按行存放的,先存储第一行,在接着存储第二行-.. 二维数组作为函数参数 二维数组作为函数的参数,实参可以直接使用二维数组名,在被调用函数中可以定义形参所有维数的大小 ...

  8. C++二维数组做函数参数

    C++二维数组做函数参数 二维数组做函数参数的形式主要有: /对于一个m行n列int元素的二维数组 //函数f的形参形式 f(int daytab[m][n]) {...}//以下两种可以忽略行数 f ...

  9. linux C 二维数组 作为函数参数

    c语言中怎么用二维数组作为函数参数 可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3 ...

最新文章

  1. Activity管理(一):activity运行机制
  2. 解决虚拟机vmware虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
  3. python头像变二维码_Python 图像处理库 pillow,提取支付宝和微信支付图片二维码...
  4. tp5获取mysql版本_TP5 + MySQL 应用地址选择
  5. docker-compose部署kafka
  6. 经典C语言程序100例之四六
  7. VR创投寻鹰会,一场深圳VR行业人的大聚会
  8. 一个比较完美的spacer div技巧
  9. 微软的报表工具 SQL Server 2000 Reporting Services 评估版
  10. 《深入理解Spark:核心思想与源码分析》——1.3节阅读环境准备
  11. [Math] 常见的几种最优化方法
  12. 使用Java实现一元二次方程求根计算器
  13. 计算机显示无法格式化,SD卡无法格式化怎么办
  14. 【回眸】安装Hightec后如何导入源码及相关环境配置
  15. 新颖的_基于web的毕业设计题目50例
  16. lucene 创建索引慢的问题
  17. 【智能家居平台】天猫精灵 -- 平台剖析
  18. 康奈尔大学计算机系教授,独家解析康奈尔大学EE专业的五大方向
  19. UP AI Core架起研扬和英特尔合作的桥梁
  20. 长安链赋能北京140余个政务服务应用场景

热门文章

  1. eclipse 创建java文件_如何在eclipse创建Java类文件呢?
  2. vue 拦截器,增加token参数
  3. Niagara内容示例 2.6 Collision
  4. SQL service基础(五)嵌套查询(UNION、EXCEPT、INTERSECT)
  5. 使用fdisk结合partprobe命令不重启系统添加 一块新的磁盘分区
  6. mac远程连接mysql
  7. Oracle 插入Date数据
  8. win10下装win7双系统_双系统安装教程,家里的电脑如何同时装两个系统?
  9. 商场三十六计——第35计 “连环计”
  10. arpspoof和driftnet截获图片