如何将二维数组作为函数的参数传递

2023-11-11

如何将二维数组作为函数的参数传递

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

正文:

 

  首先,我引用了谭浩强先生编著的《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;

  从以上可以看出,如果我们省略了第二维或者更高维的大小,编译器将不知道如何正确的寻址。但是我们在编写程序的时候却需要用到各个维数都不固定的二维数组作为参数,这就难办了,编译器不能识别阿,怎么办呢?不要着急,编译器虽然不能识别,但是我们完全可以不把它当作一个二维数组,而是把它当作一个普通的指针,再另外加上两个参数指明各个维数,然后我们为二维数组手工寻址,这样就达到了将二维数组作为函数的参数传递的目的,根据这个思想,我们可以把维数固定的参数变为维数随即的参数,例如:

 

    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);

  其实多维数组和二维数组原理是一样的,大家可以自己扩充的多维数组,这里不再赘述。写到这里,我先向看了这篇文章后悔的人道歉,浪费你的时间了。下面是一个完整的例子程序,这个例子程序的主要功能是求一个图中某个顶点到其他顶点的最短路经,图是以邻接矩阵的形式存放的(也就是一个二维数组),其实这个函数也是挺有用的,但是我们这篇文章的重点在于将二维数组作为函数的参数传递。

 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将二维数组作为函数的参数传递 的相关文章

随机推荐

  • 绘制思维导图用什么软件?告诉你三个实用的软件

    思维导图是一种有效的思维模式 应用于记忆 学习 思考等的思维 地图 有利于人脑思维的扩散 如今市面上能够辅助我们更好地锻炼大脑 产出思维导图的工具数不胜数 但不同人群的使用不同 适配的软件也不尽相同 那么今天就让我来告诉你电脑好用的思维导图
  • 蚂蚁区块链第17课 错误码指导大全

    1 摘要 本文介绍蚂蚁区块链的错误码按出错来源分为5类 平台校验错误码 虚拟机错误码 区块链错误码 客户端系统错误码 TEE 错误码 并给出了具体的错误码值和解释说明 2 错误码大全 2 1 平台校验错误码 错误码 错误码值 错误消息 描述
  • [Django] Django基础环境配置

    step1 设置python 虚拟环境并激活 然后安装Django开发版本 这里可以本人参考博客 step2 新建项目 之前安装Django以及虚拟环境都是在C盘下处理的 在这里用D盘存储项目 出现小插曲 C Users 用户名 gt d
  • 2023高教社杯数学建模思路 - 案例:FPTree-频繁模式树算法

    文章目录 算法介绍 FP树表示法 构建FP树 实现代码 建模资料 赛题思路 赛题出来以后第一时间在CSDN分享 https blog csdn net dc sinor type blog 算法介绍 FP Tree算法全称是Frequent
  • MySQL基础篇-第15章_存储过程与函数

    第15章 存储过程与函数 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com MySQL从5 0版本开始支持存储过程和函数 存储过程和函数能够将复杂的SQL逻辑封装在一起 应用程序无须关注存储过程和函数内
  • vue动态添加路由清空路由

    刚做的项目分多个模块 点击后再查询菜单 动态加进路由 直接动态添加则爆出警告信息 路由重复 于是乎想到了先清空路由 resetRouter const newRouter new Router mode hash scrollBehavio
  • TortoiseGit清除账号密码

    开发十年 就只剩下这套Java开发体系了 gt gt gt 1 编辑系统配置 2 删除配置信息 3 删除 git credentials 一般在c盘的用户目录下
  • pytorch怎么加入环境变量_pytorch安装(使用pip3装到conda环境下)(示例代码)

    之前在windows上使用pip3的方式安装过pytorch 虽然偶尔也会HTTP Error 安装失败 但是基本还是可以安装成功的 上 这一次在ubuntu上装了anaconda 想着之后的库都用conda安装 而不使用ubuntu自带的
  • 序(为什么要抄unreal源码)

    unreal所有源码很长 几百万行 一辈子也抄不完 然而 ue4 0版本的runtime只有1887个文件 251043行 不算第三方库 可以只按照渲染相关部分抄写一下 然后 逐版本增补 只需要关注渲染部分 和工作中用到的插件 还是可以的
  • 深入剖析Kubernetes之控制器模式的实现-Job与CronJob

    文章目录 Job CronJob Deployment StatefulSet 以及 DaemonSet 这三个编排概念 它们主要编排的对象 都是 在线业务 即 Long Running Task 长作业 比如 常用的 Nginx Tomc
  • 深度学习常见术语及作用--个人笔记

    1 池化层 提取重要信息 去掉不重要信息 减少参数 减少计算开销 防止过拟合 2 全连接层 FC 在整个卷积神经网络起 分类器 的作用 3 激活函数 给神经元引入了非线性因素 进而提升网络的表达能力 4 backbone 主干 骨干 网络
  • 快速查找Unity死循环

    我们先建立一个新工程 新建C 文件 然后在Start函数中加入以下代码 void Start while true int i 1 把这个C 文件挂到场景摄像机或其它GameObject上 打开这个工程对应的VS工程 如何用VS编辑unit
  • Spring DataBinding

    1 用 ModelAttribute注释方法 1 1 ModelAttribute和 RequestMapping同时注释一个方法 span style font size 14px RequestMapping method Reques
  • 送书

    六月 初夏 高考结束 毕业季到来 准大学生纠结选什么专业 毕业生迈进就业大军 不论什么身份 大家都在思考着同一件事情 当下什么能力最热门 想要得到答案很简单 打开任意一款求职软件 热门岗位的职位简介中都少不了这一项 数据分析能力 4月20日
  • 笔记&代码

    1 1数据与统计学 统计学的含义 数据及其分类和来源 1 1 1 什么是统计学 收集数据 数据分析 描述统计 利用图表 计算简单统计量 推断统计 根据样本判断总体 参数估计和假设检验 1 1 2 变量与数据 变量 数据 变量的观测结果就是数
  • TCP详解之重传机制

    TCP详解之重传机制 TCP 实现可靠传输的方式之一 是通过序列号与确认应答 在 TCP 中 当发送端的数据到达接收主机时 接收端主机会返回一个确认应答消息 表示已收到消息 但在错综复杂的网络 并不一定能如上图那么顺利能正常的数据传输 万一
  • OpenGL ES 着色器(shader)介绍

    1 Shader Shader其实就是一段执行在GPU上的程序 此程序使用OpenGL ES SL语言来编写 它是一个描述顶点或像素特性的简单程序 在opengles中常用的shader有两种 vertex shader和fragment
  • 在styled-components的样式声明中做px到rem的自动转换

    原文地址 最近在尝试使用styled components来做React下的样式开发 这样可以利用js语言的灵活来增强css的能力 在用styled components处理px到rem的转换时 有点问题了 styled component
  • 嵌入式学习(四)——串口

    目录 一 通信的基本概念 1 1 同步通信和异步通信 1 2 电平信号和差分信号 1 3 并行接口和串行接口 1 4 单工通信和双工通信 二 串口通信 2 1 基本概念 2 2 起始位 数据位 奇偶校验位 停止位 2 3 RS232电平和T
  • 如何将二维数组作为函数的参数传递

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