函数 "int (*function())[10];" 的含义是什么?

13

我阅读了一段代码,并发现有一个像这样的函数。

int (*function())[10]{
 ...
}

我感到困惑,这个函数是什么意思,它会返回什么?


13
好的,我会尽力进行翻译。以下是需要翻译的内容链接:http://cdecl.org这是一个在线工具,用于解析 C 语言中复杂的声明语句。输入一个声明语句,它将返回解析结果和解释。http://c-faq.com/decl/spiral.anderson.html这是一篇关于 C 语言中声明语句的文章,作者通过一个螺旋式的例子详细介绍了如何理解和使用声明语句。文章包含了大量的示例代码和解释,适合深入学习 C 语言的人阅读。 - chris
还可以查看一些关于函数指针的教程,例如http://www.cprogramming.com/tutorial/function-pointers.html。 - Mihai8
3
但是函数指针和问题中的任何事情都没有关系? - CB Bailey
我在想我的回答是否有帮助。它有用吗?(我希望有用) :-) - David G
3个回答

16
这是一个返回指向包含10个整数的数组的指针的函数定义。
请记住,返回值是一个指针,而不是一个实际的数组。数组不能从函数中返回。根据标准的第8.3.5/8段规定:
“函数不应具有类型为数组或函数的返回类型,尽管它们可以具有类型为指向这些东西的指针或引用的返回类型。”
以下是如何使用它的简单示例:
int arr[10];     // an array of 10 int
int (*ptr)[10]; // pointer to an array of 10 int

int (*function())[10] // function returning a pointer to an array of 10 int
{
    return ptr;
}

int main()
{
    int (*p)[10] = function(); // assign to the pointer
}

您可以在任何通常使用指针的地方使用它。但请注意,与指针相比,有更好的选择,如std::shared_ptr<std::array<T, N>>std::shared_ptr<std::vector<T>>

1
@NikosC。是的,我们返回一个指针,就像任何其他对象一样。另一个优点是,只有当数组大小为10时才会编译,不涉及类型衰减。 - David G
2
@NikosC。int (*arr)[10] = function(); - David G
1
typedef int arr10[10]; typedef arr10 *parr10; parr10 foo(); 或类似的内容。 - Yakk - Adam Nevraumont
@NikosC。凭记忆我相信这应该是 int (*(*f()))[10]; - David G
不,实际上它是 int (*(*f())())[10]; - David G
显示剩余12条评论

8

阅读它的方式是找到最左边的标识符并向外工作,记住()[]*之前绑定,因此*a[]是指针数组,(*a)[]是指向数组的指针,*f()是一个返回指针的函数,而(*f)()是函数的指针。因此,

      function          - function
      function()        - is a function
     *function()        - returning a pointer
    (*function())[10]   - to a 10-element array
int (*function())[10]   - of int

1
以前从未遇到过返回数组(或指向数组的指针)的函数;右边的“[]”看起来很奇怪。我猜下一步复杂度将是声明指向此函数的指针。 - Nicolas Miari
另一种看待它的方式是用符号 f 替换 function(),得到 int (*f)[10];现在它看起来不那么奇怪了。 - John Bode
当然,从语法上讲,它是完全符合逻辑的;只是你可能会编程多年而不遇到这种情况,这让我措手不及... 我想每天都能学到一些东西 ;) - Nicolas Miari

0

这意味着它是一个函数指针,参数为void,返回值为int[10]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接