二维数组名作为实参或者形参
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指
定所有维数的大小,也可以省略第一维的大小说明,如:
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;
从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确
的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,
这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们
完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数
指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数
传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:
void Func(int array[3][10]);
void Func(int array[][10]);
变为:
void Func(int **array, int m, int n);
在转变后的函数中,array[i][j]这样的式子是不对的(不信,大家可以试一下),因为
编译器不能正确的为它寻址,所以我们需要模仿编译器的行为把array[i][j]这样的式子
手工转变为
*((int*)array + n*i + j);
在调用这样的函数的时候,需要注意一下,如下面的例子:
int a[3][3] =
{
{1, 1, 1},
{2, 2, 2},
{3, 3, 3}
};
Func(a, 3, 3);
根据不同编译器不同的设置,可能出现warning 或者error,可以进行强制转换如下调用
:
Func((int**)a, 3, 3);
其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述
。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个完整的例
子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以
邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但是我们这
篇文章的重点在于将二维数组作为函数的参数传递。
但是使用变长数组又不时这样了呢?同样传递的都是数组的地址?(谁能解答呢???!!)
二维数组名作为实参或者形参相关推荐
- 将二维数组名作为函数实参
可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以指定所有维数的大小,也可以省略第一维的大小说明,如: void Func(int array[3][10]); void Func( ...
- 二维数组作为形参的参数传递问题[08-0704]-转
2008-07-04 19:06 以下是网上摘抄的一段: 首先,我引用了谭浩强先生编著的<C程序设计>上面的一节原文,它简要介绍了如何将二维数组作为参数传递,原文如下(略有改变,请原谅): ...
- 关于二维数组传参做形参
二维数组的存储方式是和一维数组没什么区别,但是用二维数组做参数,它的形参该怎样写?要注意的是:函数中的形参其实就相当于一个声明,并不产生内存分配,形参的目的就是要让编译器知道函数参数的数据类型. 正确 ...
- 二维数组的传参数的方法
如何将二维数组作为函数的参数传递 今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维 ...
- C/C++如何传递二维数组?
用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). ----------------------------- ...
- 如何将二维数组作为函数的参数传递
如何将二维数组作为函数的参数传递 声明: 如果你是得道的大侠,这篇文章可能浪费你的时间,如果你坚持要看,我当然感觉很高 兴,但是希望你看完了别骂我!如果你发现我这篇文章有错误的话,你可以提出批评以及 ...
- 二维数组传参||传值
先给出问题: 像下面这样的数组,在函数中如何传参?也就是说如何保证虚参与实参类型一致. char str_arr[3][10] = {"yes","no",&q ...
- 二维数组作为函数的参数传递
如何将二维数组作为函数的参数传递,这是涉及到多维数组时经常要遇到的问题.长期来,我们往往知其然,但不知其所以然.这里简单总结一下. 1.<C程序设计>中讲到:可以用二维数组名作为实 ...
- C语言二维数组作为函数参数的使用
c语言中经常需要通过函数传递二维数组,有三种方法可以实现,如下: 方法一, 形参给出第二维的长度. #include <stdio.h> void func(int n, char str ...
最新文章
- 博客园上海俱乐部第二次活动全程图片报道(多图)
- 内存模型 C++ 和Java内存模型
- HTML+CSS+JS实现 ❤️ 宇宙星球旋转动画特效❤️
- WinAPI: PolylineTo - 绘制一组连续线段(更新当前位置)
- vbs获取群聊当前内容_通过VBS脚本批量检测服务器状态 - 易本地工作室-Ebend SoftwareNetwork Studio - 群发,采集,管理类软件定制开发服务【易本地工作室】...
- C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结
- c语言数组如何把一串数字存入数组_C语言 指针 (三)指针数组与数组指针
- fpga多摩川编码器开源代码_F28379D之CLB解码多摩川编码器1——入手小知识(原创)...
- 4.16访问日志不记录静态文件,访问日志切割以及静态元素过期时间
- join丢失数据_15、Hive数据倾斜与解决方案
- ad18 bell封装_Altium 中异形焊盘异形封装的创建图文教程
- ftp服务器上传显示550,ftp上传文件服务器报550
- 6. 【图的基本操作】Adjacent、Neighbors、InsertVertex、DeleteVertex、AddEdge、RemoveEdge、FirstNeighbor、Next....
- python基础(08)——随机模块函数,字符串
- 各种语言常用壳的特征
- 基于MPC算法的汽车自适应巡航系统仿真与分析
- 硬盘柱面损坏怎么办_硬盘在坏道检测中出现了要多少个损坏柱面才说明这个硬盘废了?...
- 985高校博士因文言文致谢走红!导师评价其不仅SCI写得好...
- 预先下载的keras库中神经网络模型指定存放路径及如何上传的问题
- OpenCV:minMaxLoc vs minMaxIdx
热门文章
- 删除出现次数最少字符串JAVA_牛客网——华为机试(题23:删除字符串中出现次数最少的字符)(Java)...
- 如何在没有安全启动或 TPM 2.0 的传统 BIOS 上安装 Windows 11
- 信安精品课:2020年软考信息安全工程师备考公开课
- linux提取声卡的codec教程,发个菜鸟提取声卡codec文件图文教程,老手就别看了,小心被骂!...
- mysql不使用swapp的原因_SolidWorks不能使用的原因
- QT动态库和静态库使用
- SQL语句中的TOP(expression) [PERCENT] [WITH TIES] 用法
- OpenStack搭建glance
- Java基础知识强化53:经典排序之选择排序(SelectionSort)
- centOS安装openoffice的方法