【问题标题】:Returning a pointer to the array passed to parameter list返回指向传递给参数列表的数组的指针
【发布时间】:2016-08-28 15:19:06
【问题描述】:

我想返回一个指向我刚刚传递的数组的指针。为什么我不允许?

int(*func(int arr[10]))[10]
{
    return arr;
}

【问题讨论】:

    标签: c++ arrays pointers


    【解决方案1】:

    因为当你将一个数组传递给一个函数时,它会衰减为一个指针,更准确地说是一个指向第一个元素的指针。

    在您的示例中,参数 arr 实际上是一个 指针 而不是数组(这也是为什么您不能在“数组”上使用 sizeof 来获取大小的指针而不是它指向的内容)。当您声明 int arr[X] 之类的参数时(X 的值无关紧要),它实际上等同于声明 int *arr。当您知道实际返回类型应该是什么时也非常清楚:int*:

    int* func(int* arr)
    {
        return arr;
    }
    

    消除疑虑或歧义的一种方法是改用std::array

    std::array<int, 10>& func(std::array<int, 10>& arr)
    {
        return arr;
    }
    

    作为旁注,如果你有一个 实际 整数数组,比如说

    int arr[10] = { ... };
    

    然后要获得指向它的指针(类型为int (*)[10]),那么您必须像往常一样使用地址运算符:

    &arr;
    

    关于您的评论,假设您在函数中有一个 static 数组,以及将实际 指针 返回到该数组的内容,那么您将不得不使用那个“奇怪”的返回 -类型语法。

    int (*func(int x))[10]
    {
        static int arr[10] = { ... };  // Define and initialize array
        // Some other code...
        return &arr;  // Return a POINTER to the array
    }
    

    在上面的函数中,arr 的类型是int[10]。一个指向数组的指针,是你在使用&amp;arr 时得到的,它的类型是int(*)[10]

    现在将此类型作为返回类型扩展为我们得到 int (*func(...))[10] 的函数。

    如上所述,使用 std::array 会更清楚 (IMO)。

    【讨论】:

    • OP 没有调用该函数。她的问题是函数声明,而不是函数调用。
    • @KerrekSB 我正要说... :)
    • @JoachimPileborg 我正在阅读 C++ Primer,实际上我正在重新阅读有关函数返回指向数组和函数的指针的部分。有一个函数返回指向数组的指针的示例,其声明如下:int (*func(int a))[10]。如果我可以按照您的建议返回一个数组,为什么我需要声明一个返回的数组大小?
    • @vdublevsky 更新了我对您的评论的回答。这里要知道的重要一点是,衰减到指针的数组与指向数组的指针不同。
    • @JoachimPileborg 谢谢!似乎我需要对数组衰减到指针与指向数组的指针进行一些研究
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2012-01-24
    • 2017-08-09
    • 1970-01-01
    • 2018-09-23
    • 2021-08-20
    • 2019-11-07
    相关资源
    最近更新 更多