在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长度指针数组的指针。
如果使用替换名称替换可替换的声明部分,则可以更轻松地读取此类构造。 假设f
是table()
,它是一个采用未指定数量的参数的函数, t
是int*
类型。
然后声明成为:
t(*f)[30];
这显然是指向t
的30个元素的数组的指针。
替换f
,我们得到一个函数采用未指定数量的参数,并返回一个指向t的30个元素的数组的指针:
t(*table())[30];
替换t
,我们得到一个带有未指定数量的参数的函数,并返回一个指向指向int的30个指针元素的数组的指针:
int*(*table())[30];
这条线:
int *(*table())[30];
声明“table是一个返回指向指向int的30个指针数组的指针的函数。”
有关如何阅读C类型声明的无数好文章。 这是其中之一。
总结一下:
规则:
- 左侧有一个类型名称。 调用$ typename。
- 在右边某处有一个标识符,可能被
[]
和()
和*
包围。 称之为$ identifier。
您的声明将模板化为: $identifier
是… $typename
。
-
以“$ identifier is a(n)”开头。
-
如果你可以通过消费
[...]
或(...)
来做对,那么将其添加到你的声明中。[...]
是一个(可能是空的)数组声明,写成“array(of …)”; 而(...)
是一个(可能是空的)函数声明,写成“函数返回”或“函数取回(…)返回”。 -
如果你不能正确,因为你得到一个分号,逗号,或一个右括号,那么你必须向左走。 向左移动,如果你在进程结束时消耗$ typename,或者使用指针声明(
*
,写入“指针”)或使用左括号。 在使用其中任何一个之后,除了$ typename之外,尝试再次向右移动。记住:如果可以的话,向右走,如果必须,请向左走。
你的问题,重新审视
考虑到这一点,让我们再看一遍:
int *(*table())[30];
一步步:
- $ typename =“int”
- $ identifier =“table”;
-
以“$ identifier is a(n)”开头:“table is a(n)”
${typename} *(*${declaration}())[30];
-
向右:“…函数返回”
${typename} *(* ${declaration} )[30];
- 向右:失败,因为
)
- 向左走:“…指针到”
${typename} * ${declaration} [30];
- 向右:“……数组30”
${typename} * ${declaration};
- 向右:失败,因为
;
${typename} * ${declaration}
- 左转:“…指针指向”
${typename} ${declaration}
- 走吧:失败。
- 左转:“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)每个元素都是整数指针类型,即每个元素指向一个整数。
有关该规则的更多信息在此链接中得到了很好的解释: “顺时针/螺旋规则”