zoukankan      html  css  js  c++  java
  • 参数 存在二维数组

    声明函数如下void function(int** p),意图是想参数传递一个二维数组。于是就定义了一个二维数组,比如 int a[1][1],然后调用函数。结果如何?当然是失败了,编译器提示:cannot convert parameter 1 from 'int [1][1]' to 'int **',参数类型不匹配。上述过程我自己也试了,当然不匹配,类型完全不一样嘛。然后我就想了:如果要将一个二维数组作为形参,那么函数该怎么声明?

    简单点

    数组名作为形参

    void func1(int Array[][10])
    {
    
    }
    
    int main()
    {
        int array[10][10];
        func1(array);
    }

    编译通过,注意形参声明一定要给出第二个维度的大小,要不编译不过。

    一维数组指针作为形参

    void func2(int (*pArray)[10])
    {
    
    }
    
    void func2_1(int (*pArray)[]) //编译通过,无法调用,第二维没有给出
    {
    
    }
    
    int main()
    {
        int array[10][10];
        func2(array);
    }

    其实二维数组名就是一个指向一维数组的指针,所以这种声明方式OK。必须指定一维数组的长度,如果没有指定的话,函数声明编译通过。但是如果一旦有调用代码,就有编译不通过,因为没有实参类型能匹配int[].

    二维数组引用作为形参

    void func3(int (&pArray)[10][10])
    {
    
    }
    
    int main()
    {
        int array[10][10];
        func3(array);
    }

    必须指定两个维度的长度。

    二维数组指针作为形参

    void func4(int (*pArray)[10][10])
    {
    
    }
    
    int main()
    {
        int array[10][10];
        func4(&array);
    }

    必须指定两个维度的长度

    回到本文开始提到的问题:可以用双重指针int**作为形参,接受二维数组实参吗?答案是肯定的,但是又局限性。用双重指针作为形参,那么相应的实参也要是一个双重指针。事实上,这个双重指针其实指向一个元素是指针的数组,双重指针的声明方式,很适合传递动态(即维数是变量)创建的二维数组。怎么动态创建一个二维数组?如下程序:

    void func5(int** pArray, int n) 
    {  
    
    }  
    
    int main()
    {
         int n=10;
        int **a=new int *[n];
         for(int i=0;i<n;i++)
            a[i]=new int[n];
    }
  • 相关阅读:
    C#磁吸屏幕窗体类库
    准备
    我写的诗
    How to turn off a laptop keyboard
    How to tell which commit a tag points to in Git?
    Why should I care about lightweight vs. annotated tags?
    How to get rid of “would clobber existing tag”
    Facebook, Google and Twitter threaten to leave Hong Kong over privacy law changes
    The need for legislative reform on secrecy orders
    Can a foreign key be NULL and/or duplicate?
  • 原文地址:https://www.cnblogs.com/home123/p/7505501.html
Copyright © 2011-2022 走看看