【问题标题】:Passing multidimensional arrays gives and error传递多维数组给出和错误
【发布时间】:2015-09-21 15:04:39
【问题描述】:

我正在尝试将多维数组传递给函数。当我尝试编译时出现错误提示

[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;

}

【问题讨论】:

  • 请显示编译器给出的完整错误。
  • i&gt;=0,k&lt;n 等于 k&lt;n。你的意思是i&gt;=0 &amp;&amp; k&lt;n
  • 这就是你的错误:无法将参数 '1' 的 'int ()[3]' 转换为 'int ()[2]' to 'void reve (int (*)[2], int)'

标签: c++ arrays function


【解决方案1】:

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

如果函数的参数类型是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)
{
}

但是,对于多维数组,除第一个维度之外的所有维度的大小都必须完全匹配。否则,它们是不同的类型。

【讨论】:

  • 您可以更改函数签名或更改变量。您可以将ar[3][3] 更改为ar[rows][cols] 以使其正常工作。
  • 这解决了问题。全都正确。我接受你的回答。
【解决方案2】:

reve() 函数需要一个 [2][2] 数组,但您传递的是一个 [3][3] 数组。

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

【讨论】:

    【解决方案3】:

    您在内存中保留了 2 个块。在您的循环中,您将其从 2 变为 0,使其变为 3。进行以下更改。

    const int n= 2;
    

    它应该适用于您的程序。

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多