在C中这个声明的含义是什么:int *(* table());

int *(*table())[30]; 

我无法在任何地方找到解决方案。 什么是* table(),可以是函数还是数组?

你能告诉我这是什么意思吗?

你可以从里到外解码:

 int *(*table())[30]; 

最里面的绑定是table() ,它是一个带有未指定参数的函数。 下一级是*table() ,因此table返回指向某个东西的指针。 下一个级别是(*table())[30] ,所以它返回一个指向30长度数组的指针。 下一个级别是*(table())[30] ,所以它返回一个指向30长度指针数组的指针。 最后一级添加了类型说明符int *(*table())[30]

因此table是一个函数(带有未指定的参数),它返回一个指向int的30长度指针数组的指针。

如果使用替换名称替换可替换的声明部分,则可以更轻松地读取此类构造。 假设ftable() ,它是一个采用未指定数量的参数的函数, tint*类型。

然后声明成为:

 t(*f)[30]; 

这显然是指向t的30个元素的数组的指针。

替换f ,我们得到一个函数采用未指定数量的参数,并返回一个指向t的30个元素的数组的指针:

 t(*table())[30]; 

替换t ,我们得到一个带有未指定数量的参数的函数,并返回一个指向指向int的30个指针元素的数组的指针:

 int*(*table())[30]; 

这条线:

 int *(*table())[30]; 

声明“table是一个返回指向指向int的30个指针数组的指针的函数。”

有关如何阅读C类型声明的无数好文章。 这是其中之一。

总结一下:

规则:

  1. 左侧有一个类型名称。 调用$ typename。
  2. 在右边某处有一个标识符,可能被[]()*包围。 称之为$ identifier。

您的声明将模板化为: $identifier是… $typename

  1. 以“$ identifier is a(n)”开头。

  2. 如果你可以通过消费[...](...)来做对,那么将其添加到你的声明中。 [...]是一个(可能是空的)数组声明,写成“array(of …)”; 而(...)是一个(可能是空的)函数声明,写成“函数返回”或“函数取回(…)返回”。

  3. 如果你不能正确,因为你得到一个分号,逗号,或一个右括号,那么你必须向左走。 向左移动,如果你在进程结束时消耗$ typename,或者使用指针声明( * ,写入“指针”)或使用左括号。 在使用其中任何一个之后,除了$ typename之外,尝试再次向右移动。

    记住:如果可以的话,向右走,如果必须,请向左走。

你的问题,重新审视

考虑到这一点,让我们再看一遍:

 int *(*table())[30]; 

一步步:

  1. $ typename =“int”
  2. $ identifier =“table”;
  3. 以“$ identifier is a(n)”开头:“table is a(n)” ${typename} *(*${declaration}())[30];

  4. 向右:“…函数返回” ${typename} *(* ${declaration} )[30];

  5. 向右:失败,因为)
  6. 向左走:“…指针到” ${typename} * ${declaration} [30];
  7. 向右:“……数组30” ${typename} * ${declaration};
  8. 向右:失败,因为; ${typename} * ${declaration}
  9. 左转:“…指针指向” ${typename} ${declaration}
  10. 走吧:失败。
  11. 左转:“int”

写下所有的顺序,你会得到:

table是一个(n)函数,返回指向int的30个指针数组的指针

通过删除不需要的(s)并用“a pointer”替换单个指针来清理句子:

table是一个返回指向指向int的30个指针数组的指针的函数。

标识符是一个返回指向30个整数指针数组的指针的函数。 作为学习所谓的顺时针/螺旋规则的补充,您可以使用像http://cdecl.org/这样的网站来查找。

如果我能够重写代码,我会将声明拆分为类型声明和函数声明。 这样,理解程序文本会更容易。 此外,我将调用结果类型并为函数选择一个更具体的名称,这很可能返回一种特殊的表,比如一个Foo表。 如果可能的话,我也会避免使用空参数列表并使用关键字void来指定该函数不带参数:

 typedef int *(*Table)[30]; Table FooTable(void); 

上述声明可以通过顺时针/螺旋规则来理解。

在此处输入图像描述

下面介绍如何使用规则解析声明:

1) table是一个带有未指定参数的函数。

2) table()函数返回一个指针

3) table()函数返回的指针指向 30个元素的数组。

4)每个元素都是整数指针类型,即每个元素指向一个整数。

有关该规则的更多信息在此链接中得到了很好的解释: “顺时针/螺旋规则”