在 C++ 中将二维数组作为函数参数传递时出错

Error in Passing 2d array as function argument in C++

我正在尝试将二维数组传递给函数,但编译器显示错误:

错误:无法将参数 1 转换为 int (*)[5]int**int 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;
}

我相当确定您必须在函数声明和初始化中声明数组的大小。

int max_size(int *g[] 应该是 int max_size(int *g[5] 或者数组的大小应该是什么。

改变

int max_size(int *g[],int m,int n)

int max_size(int g[][c],int m,int n)

int a[6][5]; 定义支持步长语法的单个内存数组。

int * a[]int ** a 不提供步长(或行或列大小,具体取决于您的想法)并定义指向其他内存的指针数组,而不是像 int a[6][5]; 这样的单个内存块。

有一些方法可以做到

1) 当第二维全局可用时(作为宏或全局常量)。

int max_size(int g[][c],int m,int n)

2) 使用单个指针

void max_size(int *g, int m, int n) and call it as
max_size((int *)m,r,c)

3) 使用指针数组或双指针

void max_size(int *g[], int m, int n) and call it as

max_size((int **)m,r,c)

它们中的任何一个都会work.Its您想要的使用方式。

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

二维数组(例如 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 │
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

A int** 当用作一种二维数组时(其中最外层的指针指向指针数组中的第一个元素,并且每个指针都指向整数数组中的第一个元素)看起来像这样:

┌─────┐
│     │ // The int**
└──╂──┘
   ┃
   ▼
┌─────┬─────┬┄
│     │     │   // An array of int*
└──╂──┴──╂──┴┄
   ┃     ┗━━━━━━━━━━┓
   ▼                ▼
┌─────┬─────┬┄   ┌─────┬─────┬┄
│ int │ int │    │ int │ int │    // Arrays of ints
└─────┴─────┴┄   └─────┴─────┴┄
  0,0   0,1        1,0   1,1

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

int max_size(int (*g)[c],int m,int n);

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

int max_size(int g[][c],int m,int n);

数组类型的参数(像这个)被转换为指针——也就是说,[] 真的根本没有说 "array"。事实上,您可以在这些括号中输入尺寸,但它会被完全忽略。