三种传参,操纵二维数组

利用三种不同的方式在函数参数中,传递二维数组:

void func(int **a,int m,int n); 利用二级指针
void func(int *a[],int m,int n); 利用一维指针数组
void func(int a[][10],int m,int n); 利用二维数组

请问:那种方式可以在函数func中通过参数a操纵传递进的二维数组?如果不能,原因是什么?

下面这俩是等价的:

void func(int **a,int m,int n);
void func(int *a[],int m,int n); 

不管你是 int **a 还是 int *a[],编译器把a都当作“指向指针的指针”,也就是你说的二级指针。这里如果你直接 a[1][6] 这样访问是没意义的,编译器根本不知道你每行每列的偏移嘛。

但如果你用void func(int a[][10],int m,int n);,这就让编译器明确地知道:a是一个“'指向10元素int数组的指针'数组”,a[1][6] 是可以成功访问的。

写个代码测下就明白了:

 #include <iostream>
using namespace std;

/*
void func(int **a,int m,int n)
{
    cout << a[m][n] << endl;    // 编译报错
}

void func(int *a[],int m,int n)
{
    cout << a[m][n] << endl;   // 编译报错
}
*/

void func(int a[][10],int m,int n)
{
    cout << a[m][n] << endl;   // 编译通过,输出6
}

int main()
{
    int a[2][10];

    for (int i = 0; i < 2; i++)
    {                                      
        for (int j = 0; j < 10; j++)
        {
            a[i][j] = i + j;
        }
    }

    func(a, 1, 5);

    return 0;
}

数组怎么传,都会转为指针传递,都可以操作数组元素

 如果参数是a,则是
void func(int a[][10],int m,int n); 利用二维数组

因为a是对数组首元素取地址,**a和*a[]都是指针,首元素地址和指针不是一个概念,数组名a只是个常量(一个值为数组首元素地址的常量),不能进行++或者--运算

二级指针也可以使用,但是你得自己做地址操作,而不能直接用数组后缀
这种情况下,你可以动态指定数组维数

三个函数都是可以的。