在C++中将2d数组作为函数参数传递出错

ed *_*ale -2 c++ arrays 2d function

我试图将2d数组传递给函数但编译器显示错误:

错误:无法转换int (*)[5]int**的参数1int max_size(int**, int, int)

我知道这个理论但却无法弄清楚它为什么不起作用.

    #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

#define r 6
#define c 5

using namespace std;

int max_size(int *g[],int m,int n)
{
    // Initial Structure for DP
    int i,j;
    int **s = (int **) malloc (r*sizeof(int *));
    for(i=0;i<r;i++)
        s[i]=(int *)malloc(c*sizeof(int));
    memset(s,0,sizeof(s));

    // Initialization for DP
    for(i=0;i<r;i++)
        s[i][0] = g[i][0];
    for(i=0;i<c;i++)
        s[0][i] = g[0][i];

    // Formulation for DP

    for(i=1;i<r;i++)
    {
        for(j=1;j<c;j++)
        {
            if(g[i][j])

                s[i][j]= min(s[i-1][j],s[i-1][j-1],s[i][j-1])+1;

            else
                s[i][j]=0;
        }
    }

    int c = 0;

    for(i=0;i<r;i++)
    {
        for(j=0;j<c;j++)
        {
            if(s[i][j]>c) c=s[i][j];
        }
    }

return c;
}


int main()
{
   int m[r][c] = {{1,0,1,1,1},{1,1,1,0,0},{1,0,0,0,1},{1,1,0,0,0},{1,0,0,0,1}};
   cout<<max_size(m,r,c);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

Jos*_*eld 5

您正在尝试将2D数组作为类型的参数传递int**.这种转换是不可能的,因为它们将具有根本不同的结构.

2D数组(例如3x3)在内存中看起来像这样:

  0,0   0,1   0,2   1,0   1,1   1,2   2,0   2,1   2,2
???????????????????????????????????????????????????????
? int ? int ? int ? int ? int ? int ? int ? int ? int ?
???????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

int**使用时作为一种2D阵列的(其中,最外面的指针指向在指针数组的第一个元素,并且每个这些点,以整数数组的第一个元素的)如下所示:

???????
?     ? // The int**
???????
   ?
   ?
??????????????
?     ?     ?   // An array of int*
??????????????
   ?     ????????????
   ?                ?
??????????????   ??????????????
? int ? int ?    ? int ? int ?    // Arrays of ints
??????????????   ??????????????
  0,0   0,1        1,0   1,1
Run Code Online (Sandbox Code Playgroud)

但是,类型的2D数组int[x][y]可以转换为类型int(*)[y](这通常称为数组到指针转换),因此您可以像这样编写函数:

int max_size(int (*g)[c],int m,int n);
Run Code Online (Sandbox Code Playgroud)

或者可以用一些语法糖来编写,如下所示:

int max_size(int g[][c],int m,int n);
Run Code Online (Sandbox Code Playgroud)

数组类型的参数(像这一个)被转换为指针 - 也就是说,[]根本就没有说"数组".实际上,您可以在这些括号中放置一个大小,但它将被完全忽略.