【问题标题】:How to return pointers to arrays from functions?如何从函数返回指向数组的指针?
【发布时间】:2019-09-13 19:15:47
【问题描述】:

我想要一个函数返回一个指向大小为 10 的数组的指针。这样的函数的原型是什么?

我尝试了 3 种不同的原型,但都不起作用:

int(*)[10] returnPtrArray(int (*arr)[10])
{
    return arr;
}
//The return type doesn't seem to work

int(*)[10] returnPtrArray(int[][10]);
int (returnPtrArray(int[][10])(*)[10];
int(*)(returnPtrArray(int[][10])[10];
//none of these prototypes seem to work

//calling
int main()
{
    int a[5][10];
    int (*ptr)[10] = returnPtrArray(&a);
    //How do I make this work?
}

【问题讨论】:

    标签: c arrays function-prototypes


    【解决方案1】:

    函数的正确定义是:

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

    分解:returnPtrArray 是一个函数:

    returnPtrArray()
    

    这需要一个指向 10 个数组的指针 int:

    returnPtrArray(int (*arr)[10])
    

    并返回一个指针:

    *returnPtrArray(int (*arr)[10])
    

    到一个大小为 10 的数组:

    (*returnPtrArray(int (*arr)[10]))[10]
    

    int:

    int (*returnPtrArray(int (*arr)[10]))[10]
    

    你会这样称呼它:

    int a[5][10];
    int (*ptr)[10] = returnPtrArray(a);
    

    【讨论】:

      【解决方案2】:

      试试这个原型:

      int (*returnPtrArray(int (*arr)[10]))[10];
      

      这是一个名为returnPtrArray的方法,它的参数是一个指向10个整数数组的指针。

      它返回一个指向 10 个整数数组的指针。

      在 Live demo 中查看它,我从方法调用的参数中删除了 &,因为它会出错。


      此答案基于更具分析性的帖子Declare a C/C++ function returning pointer to array of integer pointers。

      【讨论】:

      • 不,没有错。我没有对答案投反对票。其他人必须有。
      • 感谢@DarkAtom。我建议您接受 dbush 的回答,因为它比我的更具分析性(在他们的编辑之后)!
      • 我评论了他的回答,我会的。我也赞成你的,因为它没有错,不值得-1(idk谁反对它)。
      【解决方案3】:

      指针不知道它们指向什么,除了类型。如果你需要传递一个数组,你需要在一个单独的参数中传入一个指针和数组的长度(或者使用像std::vector这样的列表实现)。

      【讨论】:

      • 您不需要需要传递长度(它可能在某处定义为常量),尽管这通常是个好主意。如果您无法更改类型,vector 可能不是一个选择(无论它是多么好的想法)。
      • 对于只返回数组的函数,您不需要传递大小,因为您没有访问数组,因此没有超出范围的风险。另外,你所说的并没有回答我的问题。投反对票。
      • 顺便说一句,您推荐使用std::vector,但您是否看到问题被标记为C,而不是C++?
      猜你喜欢
      • 2021-06-25
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 2015-08-07
      相关资源
      最近更新 更多