用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的)。

【以下转帖】
----------------------------------------------------------------------------------------------
但一般传递二维数组的基本规则好像是这样的:可以用二维数组名作为实参或者形参,在被调用函数中对形参数组定义时可以可以指定所有维数的大小,也可以省略第一维的大小说明。如:

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

二者都是合法而且等价,但是不能把第二维或者更高维的大小省略,如下面的定义是不合法的
    void Func(int array[][]);

将二维数组当作参数的时候,必须指明所有维数大小或者省略第一维的,但是不能省略第二维或者更高维的大小,这是由编译器原理限制的。在学编译原理这么课程的时候知道编译器是这样处理数组的:
对于数组 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);
----------------------------------------------------------------------------------------------

需要(int**)的强制转换,是因为二维数组和二级指针是不同的,a实质上是一个int (*a)[3],它是一个数组指针,即a[0]是第一维数组的首个元素的地址,a[1]是第二维数组的首个元素的地址,a[2]是第三维数组的首个元素的 地址,与int**是不同的类型;如果转为int**,就失去了像数组指针那样a + i = a + i*3的效果了
而如果又定义一个char *p[3],它是一个一维的指针数组,此时p是指向了一个指针,而不是数组。那么这时如果定义char **q = p,就是可以的,而且可以通过q[0],q[1]来访问字符串。

数组和指针这种东西真是太繁琐复杂了,个人愚见,在C++里就尽量使用STL,并且可以用模板的非类型形参来解决这种灵活处理不固定行列数矩阵的函数,Effective C++里面应该有介绍,并且有对这种模板的优化。

转载于:https://www.cnblogs.com/jkred369/p/4395849.html

C/C++怎样传递二维数组,转载自CSDN相关推荐

  1. 黑马程序员——c语言学习心得——函数传递二维数组

    黑马程序员--c语言学习心得--函数传递二维数组 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 一.定义指针的时候一定要初始化.    变量 ...

  2. C/C++如何传递二维数组?

    用二维数组作为参数传递(用二维数组处理矩阵),但是希望接受传递二维数组参数的函数可以处理任意维度的数组(希望矩阵的行数和列数都是不固定的). ----------------------------- ...

  3. 二维数组作为形参,传递二维数组的值

    二维数组作为形参,传递二维数组的值 void trfind(int (*Array)[3]); void trfind(int (*Array)[3]) {int a[][3] = {1, 2, 3, ...

  4. C/C++函数传递二维数组

    目录 函数参数传递二维数组的问题 解决方案 1.传递第二维和更高维的大小 2.根据数组的存储原理把二位数组当作一维数组来操作(降维处理) 函数参数传递二维数组的问题 将二维数组当作参数的时候,必须指明 ...

  5. c语言字符二维数组传参,C语言函数传递二维数组

    C语言如果给函数传递二维数组作为参数 问题的产生 先看一个传递二维数组的例子: #include void foo(int a[][], int m, int n) { int i = 1; int ...

  6. matlab怎么输入二维数组,[转载]matlab中数组的输入

    1 matlab中数组的输入 在matlab中写数组,直接输入元素的数组,应用中括号[],成行向量时,元素之间用空格或逗号隔开,成列向量时,分列处用分号隔开,也可以对相应行向量作转置,为在中括号外加单 ...

  7. C/C++传递二维数组[转载]

    #include <stdio.h> void func(int n, char str[][5]) { int i; for (i = 0; i < n; i++) { print ...

  8. c++ 二维数组传递

    c++ 二维数组传递 我们在传递二维数组时,对于新手来说,可能会存在某些问题,下面讲解几种传递方法 在讲解如何传递二维数组时,先看看如何动态new 二维数组 1 // 二维数组动态申请 2 int r ...

  9. 向函数传递一维数组和已知大小的二维数组

    一维数组 在C语言中,向函数传递参数只有一种形式--值传递.不管是传递一个整型变量,还是传递一个指针,函数得到的都只是实参的拷贝值. 先定义一个一维整型数组: int a[] = { 0, 1, 2, ...

  10. C# 传递数组参数_一维数组_二维数组

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

最新文章

  1. fsl线性配准实践+核磁共振影像数据处理
  2. 日本精密减速器,到底牛在哪?
  3. 【记录】台式机的组装
  4. 编写安装配置DHCP服务脚本
  5. RK3288 GMAC整理
  6. IDEA Project Structure 配置说明
  7. 【直播回放】80分钟剖析GAN如何从各个方向提升图像的质量
  8. 软件设计最近发展趋势对话录
  9. opencv学习笔记17:梯度运算之laplacian算子及其应用
  10. NYOJ_269_VF
  11. H3C 基于IP的限速
  12. 从零开始玩转JMX(四)——Apache Commons Modeler Dynamic MBean
  13. UIScrollViewDelegate-代理API详解
  14. 结构体+sort方法
  15. 关于SQL server事务
  16. 网页设计-[CSS+DIV设计实例:超酷的竖排导航栏 ]
  17. c语言检查tcp连接_TCP/IP的底层队列
  18. CentOS 7.4安装postgresql96
  19. 干粉灭火器(泡沫灭火器)工作原理
  20. 3DMax游戏建模常用基本命令

热门文章

  1. 微软ReportViewer(rdlc)发布时所需要的动态库(vs2010)
  2. Java 开源报表制作
  3. 关于java中求和的方法,用可变变量来解决这个问题
  4. spring boot: 组合注解与元注解
  5. Android 视频展示控件之 SurfaceView、GLSurfaceView、SurfaceTexture、TextureView 对比总结...
  6. asp.net MVC Views-----Controller传递数据方法
  7. python IO文件处理
  8. 例题-Quota 实作:
  9. 广东地区电信官方DNS服务器
  10. C# winform 上传文件 (多种)