C/C++二维数组的传参方法总结

转自:http://blog.csdn.net/gqb_driver/article/details/8886687

C/C++语言将二维数组作为参数传递容易使人迷惑且易出错,本文将常用的几种方法列出,以方便用时查阅。三+一种方法总结如下(GCC验证成功):

  • 方法一:形参为二维数组并给定第二维长度

    此方法是最简单最直观的方法,形参与实参一样,容易理解。
    举例:

#include <stdio.h>  void subfun(int n, char subargs[][5])
{  int i;  for (i = 0; i < n; i++) {  printf("subargs[%d] = %s\n", i, subargs[i]);  }
}  void main()
{  char args[][5] = {"abc", "def", "ghi"};  subfun(3, args);
}
  • 方法二:形参为指向数组的指针并给出数组长度
#include <stdio.h>  void subfun(int n, char (*subargs)[5])
{  int i;  for (i = 0; i < n; i++) {  printf("subargs[%d] = %s\n", i, subargs[i]);  }
}  void main()
{  char args[][5] = {"abc", "cde", "ghi"};  subfun(3, args);
}  
  • 方法三:形参为指针的指针

此方法实参必须为指针,而不能为数组名

举例

#include <stdio.h>  void subfun(int n, char **subargs)
{  int i;   for (i = 0; i < n; i++) {  printf("subargs[%d] = %s\n", i, subargs[i]);  }
}  void main()
{  char *a[3];  char args[][5] = {"abc", "def", "ghi"};  a[0] = args[0];  //equals with a[0] = &args[0][0];  a[1] = args[1];  a[2] = args[2];  subfun(3, a);  //若此处为subfun(3, args);则会编译出错
}  
  • 上述代码等价于下面代码。当然我们这里只是讨论的二维数组传参问题,下面代码只起扩展作用。
#include <stdio.h>  void subfun(int n, char **subargs)
{  int i;   for (i = 0; i < n; i++) {  printf("subargs[%d] = %s\n", i, subargs[i]);  }
}  void main()
{  char *args[] = {"abc", "def", "ghi"};//equals with char *args[3] = {"abc", "def", "ghi"};  subfun(3, args);
}  

  • 方法四:形参为指针+数组的行+数组的列
#include <stdio.h>
#include <stdlib.h>void test(double *p,const int m,const int n)
{for(int i=0;i<m;i++)for(int j=0;j<n;j++)printf("%f, \n",p[i*m+j]);
}int main(int argc, char *argv[])
{double a[2][2]={{1,2},{3,4}};test((double*)a,2,2);return 0;
}
  • 但不能如下使用:原因是double** 在堆里new出来的地址并不一定是连续的,而p[i*m+j]是在访问连续地址。
#include <stdio.h>
#include <stdlib.h>void test(double *p,const int m,const int n)
{for(int i=0;i<m;i++)for(int j=0;j<n;j++)printf("%f, \n",p[i*m+j]);
}int main(int argc, char *argv[])
{//double a[2][2]={{1,2},{3,4}};double **a;a = new double*[2];for(int i =0;i<2;i++)a[i] = new double[2];//init for(int i =0;i<2;i++)for(int j =0;j<2;j++)a[i][j] = 1*i+j;for(int i=0;i<2;i++)for(int j=0;j<2;j++)printf("%f, \n",a[i][j]);test((double*)a[0],2,2);for(int i =0;i<2;i++)delete []   a[i];delete [] a;return 0;
}

C/C++二维数组的传参方法总结相关推荐

  1. C/C++语言二维数组的传参方法总结

    原创作品,转载时请务必以超链接形式标明文章原始出处:http://blog.csdn.net/gqb666/article/details/8886687,作者:gqb666 C/C++语言将二维数组 ...

  2. C/C++ 一维数组的传参/一级指针的传参 二维数组的传参/二级指针的传参 三维数组的传参/三级指针的传参 方法总结分析终极篇

    序 最近复习c/c++数组的传参,发现了一些问题,下面是一些总结和思考 正文 一维数组的传参/一级指针的传参/普通指针 在理解指针的基础上,一维数组的指针传递很简单,我们知道数组的数组名就是这个数组首 ...

  3. 二维数组的传参【01_数组指针_指向数组的指针】

    2021-04-08 二维数组的传参[01_数组指针_指向数组的指针] #include <stdio.h> #include <stdint.h> #include < ...

  4. java二维数组如何传参_C语言中二维数组作为函数参数来传递的三种方法

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

  5. 二维数组的传参调用写法

    初遇二维数组作函数参数,宛如自己化身为了大头儿子.很头大. 不禁大声呐喊:该怎么声明定义,该怎么调用,又该怎么函数中操作元素和地址? 在此,我要拨开这些问题的一些迷雾. 我相信,有心人看完后,再遇就不 ...

  6. 微信小程序生成二维码之传参(接收的参数乱码该咋解决)

    先说我的案例,我需要的是,扫码进入不同的区域展示(因此这个就需要进行二维码路径传参),大致思路:接收数据,然后根据所接收的数据进行判断,展示不同的区域. 我是用的草料二维码生成的 - https:// ...

  7. php键值对数组排序,PHP按指定键值对二维数组进行排序的方法_PHP

    本文实例讲述了PHP按指定键值对二维数组进行排序的方法.分享给大家供大家参考,具体如下: 问题: 有数组: 代码如下: array(0=>array('id'=>1,'price'=> ...

  8. 用new创建一个二维数组,有两种方法,是等价的

    //用new创建一个二维数组,有两种方法,是等价的      一:      int   (*p)[10]   =   new   int[5][10];      二:      int   **p ...

  9. 通过指针访问二维数组的三种方法

    下面总结了一下通过指针访问二维数组的三种方法,里边涉及指针.指针数组.数组指针.指向指针的指针以及二维数组的应用,愿对于大家理解和使用指针有所参考和帮助. 程序如下: #include <std ...

  10. 二维数组的传参数的方法

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

最新文章

  1. CH340E USB转串口 IC测试电路
  2. oracle 函数参数类型,ORACLE 11g中的表值函数? (参数化视图)
  3. 计算机三级网络技术题库第15套,计算机等级考试理论试题第二十五套
  4. 使用WPA Supplicant在Ubuntu 18.04/19.04上从终端连接到Wi-Fi的方法
  5. python代替javascript_Pyjamas - 用python代替javascript编写基于浏览器的应用
  6. docker 2376端口 CA 认证,并不能阻止服务器成为肉鸡
  7. v-html可能导致的问题
  8. 大数据自学好还是培训好?
  9. Android点击通知进入详情,Android 点击通知进入正在运行的程序
  10. TG Pro for mac电脑温度管理工具
  11. 元气骑士 自建服务器,元气骑士远程联机步骤教程一览
  12. 三大措施助力新华三NGFW争当市场排头兵
  13. redis学习之redis的发布和订阅
  14. 一个9年运维的经验之路
  15. 解决QGIS中GEE插件授权问题
  16. 秋招能有多卷?看完这篇文章你就懂了
  17. 魔兽世界以前的服务器找不到了,魔兽世界怀旧服服务器彻底崩溃,玩家游戏人物消失服务器全部不见...
  18. Gdevops峰会:一起探讨国产分布式数据库的选型与应用
  19. PanDownload(百度网盘下载工具)最新可用版
  20. 计算机技术对医学的影响,试议计算机技术在医学中的意义

热门文章

  1. java中 t无法对齐,java – 即使X应匹配T,也无法将X转换为T?
  2. Java基础:MySQL
  3. Zepto:基础学习
  4. mysql505复位密码_MySQL数据库复位根用户的密码_MySQL
  5. 用setTimeout代替setInterval
  6. C++学习笔记(二)——构造函数和析构函数
  7. Google是如何赚钱的 -- 四年工作离别小结
  8. SpringBoot学习笔记(3)----SpringBoot的profile多环境配置
  9. HDU4508 完全背包
  10. js-权威指南学习笔记21