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

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

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     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/fish7/p/4350425.html

C/C++如何传递二维数组?相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. c++ 二维数组传递

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

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

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

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

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

最新文章

  1. Puppy Linux 8.0 发布,代号 BionicPup
  2. BeanUtils使用
  3. boost::geometry::promote_integral用法的测试程序
  4. kitkat-s5p4418drone 记录
  5. 黑客攻防技术宝典web实战篇:工具web服务器习题
  6. poj2828 Buy Tickets
  7. 公式推导以及代码书写 11-26
  8. java参数配置jconsole_jconsole 配置详解
  9. kuka机器人RSI说明
  10. [转载].NET Core使用NPOI导出复杂,美观的Excel详解
  11. Ubuntu/Debian 微信安装
  12. 五、原型模式(Prototype Pattern)
  13. 使用pyspark 分析日志
  14. PADS打开PCB文件时出现提示:发生严重的运行时错误。
  15. QT自带QTcpServer架构分析
  16. CKA考试总结 20221003
  17. Day 02- Vue3 技术_分析工程结构
  18. Jess学习基础(二)
  19. 超实用移动固态硬盘,Lexar雷克沙SL100 Pro
  20. 引用图标库到自己页面

热门文章

  1. 1.7 matlab矩阵元素的引用(可通过下标和序号引用)
  2. 有关函数模板和类模板的说法
  3. K-近邻分类算法KNN
  4. R语言操作excel文件的数据
  5. 是什么_什么是模电,什么是数电
  6. php非,PHP实现非对称加密
  7. Python进阶8---面向对象基础1
  8. 【Linux】Linux与Windows的部分不同
  9. 斐波那契数列的实现(简单递归和动态规划)
  10. vdsm的SSL证书验证过程