二维数组传参(行列动态)

最近在做csp认证202104-2题的时候想把主函数二维数组A传递给函数B但不知到具体怎么传过去(A数组的二维都是动态的)。


#include  <bits/stdc++.h>

using namespace std;

int n,L,r,t;
int huidu(int i,int j,int r,int t,int B[][])
{
    int x1,x2,y1,y2,z,c;
    int vis=0;
    int sum=0;
    x1=i-r;x2=i+r;y1=j-r;y2=j+r;
    if(x1<0)
    {
        x1=0;
    }
    if(y1<0)
    {
        y1=0;
    }
    if(x2>n-1)
    {
        x2=n-1;
    }
    if(y2>n-1)
    {
        y2=n-1;
    }
    for(z=y1;z<=y2;z++)
    {
        for(c=x1;c<=x2;c++)
        {
            sum+=B[z][c];
            vis++;
        }
    }
    return sum/vis;
}
int main()
{
    cin>>n>>L>>r>>t;
    int A[n-1][n-1];
    int ans=0;
    int temp=0;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
            cin>>A[i][j];
        }
    }
    for(int i=0;i<=n-1;i++)
    {
        for(int j=0;j<=n-1;j++)
        {
            ans=huidu(i,j,r,t,A);
            if(ans<=t)
            {
                temp++;
            }
        }
    }
    cout<<temp<<endl;
    return 0;
}

用指针

int huidu(int i,int j,int r,int t,int *B)
{
    int x1,x2,y1,y2,z,c;
    int vis=0;
    int sum=0;
    x1=i-r;x2=i+r;y1=j-r;y2=j+r;
    if(x1<0)
    {
        x1=0;
    }
    if(y1<0)
    {
        y1=0;
    }
    if(x2>n-1)
    {
        x2=n-1;
    }
    if(y2>n-1)
    {
        y2=n-1;
    }
    for(z=y1;z<=y2;z++)
    {
        for(c=x1;c<=x2;c++)
        {
            sum+=*(B+z*n+c);
            vis++;
        }
    }
    return sum/vis;
}

该回答引用ChatGPT4与博主@晓码自在合作编写:

要将二维数组A传入函数B,有两种常用的方法:

  1. 以指针的形式传入:
c++
void funcB(int **A, int n) {
    // A是指向A[0]的指针,A[0]又是指向A[0][0]的指针
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // 使用A[i][j]访问数组元素
        }
    }
}

int main() {
    int n = 3;
    int A[n][n] = {/*...*/};
    funcB(A, n);  // 传入A的地址
}

  1. 以引用的形式传入:
c++
void funcB(int A[][n], int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            // 使用A[i][j]访问数组元素
        }
    }
}

int main() {
    int n = 3;
    int A[n][n] = {/*...*/};
    funcB(A, n);  // 传入A的引用
}

以上两种方法,funcB函数都可以访问并修改main函数中的A数组。区别在于:

指针的形式是传递A数组的地址,需要增加一层 indirectly 访问 A[i][j]。

引用的形式直接传递A数组,可以直接访问A[i][j]。

不管哪种形式,在funcB中,A的大小(行数和列数)需要通过增加一个n的形参同时传入。否则,在funcB内部无法知道A的具体大小,从而出现访问越界的错误。

所以,结合你的问题,我的建议是:

  1. 在主函数中定义 A 数组并输入;
  2. huidu函数改为以指针或引用的形式传入 A 数组:
void huidu(int (*A)[n], int n, int r, int t)   // 指针形式
void huidu(int A[][n], int n, int r, int t)   // 引用形式

  1. 在 huidu 函数内根据传入的 n 确定 A 的大小,从而正常访问并使用 A 数组。