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


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

    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, int m, int n);
    

    调用这个函数如下:

    int** a = new int*[4];
    for (int k = 0; k < 4; k++)
    {
    	a[k] = new int[4];
    }
    
    // int a[4][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
    int index = 1;
    for (int i = 0; i < 4; i++)
    {
    	for (int j = 0; j < 4; j++)
    	{
    		a[i][j] = index++;
    	}
    }
    
    Func(a, 4, 4);
    

    另外关于指针数组和数组指针的区别讲的很好。

  • 相关阅读:
    图片特效大杀器--swiper.js
    降低手机网错误率
    前端加sentry错误监控
    一些常识
    github/gitlab ssh-key公钥各种问题 解决
    移动端非常规bug
    sublime text3 高效插件及常用快捷键
    HTML5实现video标签的皮肤自定义
    C端产品前端工程管理
    利用BFS广度优先搜索,搜索字母矩阵中的单词
  • 原文地址:https://www.cnblogs.com/xwz0528/p/4749652.html
Copyright © 2020-2023  润新知