最近在做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,有两种常用的方法:
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的地址
}
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的具体大小,从而出现访问越界的错误。
所以,结合你的问题,我的建议是:
void huidu(int (*A)[n], int n, int r, int t) // 指针形式
void huidu(int A[][n], int n, int r, int t) // 引用形式