传递多维数组会导致错误

Passing multidimensional arrays gives and error

本文关键字:错误 数组      更新时间:2023-10-16

我试图将多维数组传递给函数。当我尝试编译时,我得到一个错误,说

[Error] cannot convert 'int (*)[3]' to 'int (*)[2]' for argument '1' to 'void reve(int (*)[2], int)'

有什么问题吗?我做错了什么?下面是我写的代码:

#include <iostream>
using namespace std;
const int rows=2;
const int cols=2;
const int n = 3;
void reve(int arr[rows][cols],int n){
    int br[3][3],i,j,k,l;
    for(i=n-1,k=0;i>=0,k<n;i--,k++){
        cout<<endl;
        for(j=n-1,l=0;j>=0,l<n;j--,l++)
            br[k][l]=arr[i][j];
    }
    for(i=0;i<n;i++){
        for(j=0;j<n;j++)
            arr[i][j]=br[i][j];
    }
}
int main() {
    int i,j,k,l,ar[3][3],br[3][3];
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            cin>>ar[i][j];
    int n=3;
    reve(ar,n);
    for(i=0;i<3;i++){
        cout<<endl;
        for(j=0;j<3;j++)
        cout<<ar[i][j];
}
return 0;

}

在函数调用中使用二维数组时,它会衰减为指针类型。但是,除了第一个维度之外,所有维度都必须完全匹配。

如果函数的参数类型为int (*arg)[2],则不能使用声明为int var[3][3]的变量来调用该函数。var衰减为类型为int (*)[3]的指针。

一开始让人困惑,因为它似乎在一维数组的情况下工作。

void foo(int arg[10])
{
}
int var[2];
foo(var); // OK

这是因为编译器忽略了数组第一个维度的大小。以上foo的定义与:

void foo(int arg[])
{
}

void foo(int* arg)
{
}

但是,对于多维数组,除第一个维度外的所有维度的大小必须完全匹配。

reve()函数期望一个数组[2][2],但你传递的是一个[3][3]数组。

main()中的ar数组被声明为int ar[3][3],而它应该是int ar[rows][cols]

您在内存中预留了2块。在循环中,从2到0得到3。做以下修改:

const int n= 2;