前言:今天在实现装配线调度程序时候,用到了二维数组,并将其作为函数的参数。在写程序的时候,遇到一些问题,即二维数组做函数的参数应该如何正确表示。我写程序的错误如下程序所示:

 1 #include <cstdio>
 2 void print(int *a[3])  3 {  4 printf("%d\n",a[0][0]);  5 }  6  7 int main()  8 {  9 int a[2][3] = {1,2,3,4,5,6}; 10  print(a); 11 return 0; 12 }

编译程序时候,在第10行提示错误信息:|10|error: cannot convert 'int (*)[3]' to 'int**' for argument '1' to 'void print(int**)'|。根据错误提示我明白了,   int *a[3]表示一个一维数组,数组的数据类型为整型指针(int*),数组的大小为3,这是因为[]的优先级高于*的优先级。如是我将程序改写如下,顺利通过编译,得到正确结果。

 1 #include <cstdio>
 2 void print(int (*a)[3])     //用括号将指针括起来  3 {  4 printf("%d\n",a[0][0]);  5 }  6  7 int main()  8 {  9 int a[2][3] = {1,2,3,4,5,6}; 10  print(a); 11 return 0; 12 }

下面来总结一下二维数组作为函数参数该如何表示。

1、二维数组的概念

  在C语言中,二维数组实际上是一种特殊的一维数组,它的每个元素也是一个一维数组。因此,二维数组下标形式正确写法如下:int arrays[i][j]。数组元素是按照行顺序存储的,因此当按存储顺序访问树时,最右边的数组下标(列)变化的最快。

2、二维数组作为函数参数

  规定:如果将二维数组作为参数传递给函数,那么在函数的参数声明中必须指明数组的列数,数组的行数没有太大关系,可以指定也可以不指定。因为函数调用时传递的是一个指针,它指向由行向量够成的一维数组。因此二维数组作为函数参数正确写法如下所示:

void Func(int array[3][10]); 

void Func(int array[ ][10]);

因为数组的行数无关紧要,所以还可以写成如下形式:

void Func(int (*array)[10]);  注意*array需要用括号括起来。

这种形式的声明参数是一个指针,它指向具有10个元素的一维数组。因为[]的优先级比*的优先级高,故*array必须用括号括起来,否则变成了

void Func(int *array[10]);

这时候参数相当于是声明了一个数组,该数组有10个元素,其中每个元素都是一个指向整型对象的指针。

但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的:

 void Func(int array[ ][ ]);

  因为从实参传递来的是数组的起始地址,在内存中按数组排列规则存放(按行存放),而并不区分行和列,如果在形参中不说明列数,则系统无法决定应为多少行多 少列,不能只指定一维而不指定第二维,下面写法是错误的:

void Func(int array[3][ ]);

  实参数组维数可以大于形参数组,例如形参数组定义为:

void Func(int array[3][10]);

而实参数组定义为:int array[5][10];     进行函数调用Func(array)时,由于数组在内存中是连续存放的,虽然形参与实参数组行数不对应,但是列数是相同的,具有相同的起始地址,这样可以访问到后续的值。如下述程序:

 1 #include <stdio.h>
 2
 3 void print_array(int *array, int len)  4 {  5 int i = 0;  6 for ( ; i < len; i++) {  7 printf("%d ",array[i]);  8  }  9 putchar('\n'); 10 } 11 12 void func(int array[3][10]) 13 { 14 print_array(array[0], 10); 15 print_array(array[1], 10); 16 print_array(array[2], 10); 17 print_array(array[3], 10); 18 print_array(array[4], 10); 19 } 20 21 int main() 22 { 23 int array[5][10] = { 24 {0,1,2,3,4,5,6,7,8,9}, 25 {10,11,12,13,14,15,16,17,18,19}, 26 {20,21,22,23,24,25,26,27,28,29}, 27 {30,31,32,33,34,35,36,37,38,39}, 28 {40,41,42,43,44,45,46,47,48,49} 29  }; 30  func(array); 31 return 0; 32 }

参考资料:

1、http://www.cnblogs.com/yangxi/archive/2012/03/22/2411452.html

2、K&R《C语言程序设计》第二版P95-P97

转载于:https://www.cnblogs.com/alantu2018/p/8465894.html

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

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

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

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

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

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

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

  4. C++笔记 二维数组作为函数的参数详解 三种传参的方法总结 注意要点总结

    文章目录 1.C/C++ 二维数组作为函数的参数 2.不合法写法总结 3.测试案例 3.1 传参方式1 3.2 传参方式2 3.3 传参方式3 4.运行结果 5.总结 1.C/C++ 二维数组作为函数 ...

  5. 二维数组作为函数的参数和返回值

    1. 二维数组作为函数的参数  (1)错误的做法:将二维数组传递给二维指针 //实参是二维数组,形参是int**,这样做的话编译器会报错 int main() {int arr[3][4] = { 1 ...

  6. C语言 二维数组作为函数参数的4种方式

    前言 多维数组中,二维数组是最常用的一种.在C语言编程中,二维数组的定义.取值以及赋值都比较容易,与一维数组类似.然而,在将二维数组作为函数参数传递时,参数结构较复杂,难以理解.本文章是实用型文章,注 ...

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

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

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

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

  9. C语言 二维数组和函数综合编程练习

    第1关:读入学生信息 某班期末考试科目为数学(MT).英语(EN)和物理(PH),有最多不超过30人参加考试.考试后要求: (1) 计算每个学生的总分和平均分: (2) 按总分成绩由高到低排出成绩的名 ...

  10. php 二维数组去除一项,PHP二维数组提取函数----把不需要的数据剔除

    首先说明一些这个函数的应用场景,比如说你得到的数据是个二维数组,里面的很多成员其实是不必要的,比如说api调用后不必要给别人返回一些用不到的垃圾数据吧,如下是代码. /* * delMemberGet ...

最新文章

  1. 使用Memory Analyzer tool(MAT)分析内存泄漏(一)
  2. 把文件每行的tab键分隔符改成逗号分隔符
  3. Oracle Database 10g安装后的基本环境与服务
  4. 关于DMA,TCM(ITCM和DTCM)和Cache的理解
  5. rabbitmq-java api
  6. 怎么用计算机算p a,老师,(P/A,12%,10)这个值用计算器怎么算出来?
  7. cuda加速的头文件_如何从C ++头文件调用CUDA文件?
  8. 通配符在DNS系统中的应用
  9. Maximum sum(信息学奥赛一本通-T1305)
  10. Android 布局之GridLayout(转载)
  11. html的table效果,html的table用法(让网页的视觉效果显示出来)
  12. 个人学习进度(第十四周)
  13. xshell与xftp免费版
  14. win7卡在正在启动windows界面_电脑在“windows正在启动” 画面停留的时间长如何办...
  15. ssm医院人事管理系统设计与实现 毕业设计源码111151
  16. SDIO接口WiFi驱动浅析
  17. 计算机处理汉字信息时所使用的代码是,计算机处理汉字信息时所用的代码是什么...
  18. IT行业发展凶猛,你的工作会被人工智能取代吗?
  19. 核磁共振设备工作过程人体温度监控中应用的光纤温度传感器
  20. 如何配置一台电脑。(一次解决电脑基础知识和如何选择合适电脑)

热门文章

  1. Stack of js
  2. 高级软件工程2017第7次作业--C++团队项目:Beta阶段综合报告
  3. install java 7 or 8 on ubuntu14
  4. Apple在线商店iphone5, ipad mini到货提醒 - 邮件
  5. 关于c++初始化原理与性能的讨论
  6. wpf demo (gif , multithredading,httpwatch)
  7. rem和mod的区别
  8. Sound Grinder Pro for Mac(音频批量编辑转换工具)
  9. Zabbix 5.0 监测mysql
  10. Zabbix 5.0 配置简单WEB网页监测和触发器