从 c++ 中的函数对 2d 数组的转换无效

Invalid conversion for 2d array from function in c++

本文关键字:数组 转换 无效 2d 函数 c++      更新时间:2023-10-16

我有一个列大小为 2 且行大小为 x 的 2d 数组。我想根据每行第一列的值进行插入排序。因此,如果给定的数组是 [[2,3],[4,1],[5,6],[1,6]] 我的输出数组将是 [[1,6],[2,3],[4,1],[5,6]]。我已经为此编写了C++函数。但是当我尝试返回数组时出现问题。它说"从 int (*([2] 到 int 的转换无效"。由于我在C++方面不是很有经验,我不知道如何解决这个问题以及为什么这是原因。这是我的函数:

int* Insertion(int arr[][2],int x)
{
    for(int i=0;i<x;i++)
    {
        for(int j=i;j>0;j--)
        {
            if(arr[j][0]<arr[j-1][0])
            {
                int temp1=arr [j][0];
                int temp2=arr [j][1];
                arr [j][0]=arr[j-1][0];
                arr[j][1]=arr[j-1][1];
                arr[j-1][0]=temp1;
                arr[j-1][1]=temp2;
            }
        }
    }
    return arr;
}
int* Insertion(int arr[][2],int x)

arr 是指向某个int[2]的指针。

int[2]可能是也可能不是整个int[2]数组的开始。

实际上,该函数完全等效于:

int* Insertion(int (*arr)[2],int x)

所以arr的类型是int(*)[2].返回类型为 int* .这两种指针类型不兼容,因为它们指向非常不同的东西,因此出现错误消息。


一个优雅的解决方法是使用 auto 返回类型,以便返回类型与arr类型相同,而无需再次拼写复杂类型:

auto Insertion(int arr[][2],int x) -> decltype(arr)

一个更优雅的解决方法是摆脱所有这些指针废话,并使用大小为 x*y 的std::vector来存储数据。搜索堆栈溢出以获取有关如何在C++中创建矩阵数据类型的想法。

using type = int [ 2 ] ;
type * Insertion(int arr[][2],int x) { return arr ; }

arr 的类型是"大小为 2 的 int 数组数组",可以转换为指向大小为 2 的数组的指针。


顺便说一句,如果你想要没有别名的完整声明,有一个语法:

int ( * Insertion( int arr[][ 2 ] , int x ) )[ 2 ] ;