int *(*table())[30];
我无法在任何地方找到解决方案。 什么是* table(),可以是函数还是数组?
你能告诉我这是什么意思吗?
答案 0 :(得分:5)
你可以从里到外解码:
int *(*table())[30];
最里面的绑定是table()
,这是一个带有未指定参数的函数。下一个级别是*table()
,因此table
正在返回指向某个内容的指针。下一级是(*table())[30]
,所以它返回一个指向30长度数组的指针。下一级是*(table())[30]
,所以它返回一个指向30长度指针数组的指针。最终级别添加了类型说明符int *(*table())[30]
。
所以table
是一个函数(带有未指定的参数),它返回一个指向int
的30长度指针数组的指针。
答案 1 :(得分:3)
如果使用替换名称替换可替换的声明部分,则可以更轻松地读取此类构造。假设f
是table()
,这是一个采用未指定数量的参数的函数,而t
是int*
类型。
然后宣言变为:
t(*f)[30];
这显然是指向t
的30个元素的数组的指针。
替换f
,我们得到一个带有未指定数量的参数的函数,并返回一个指向30个t元素数组的指针:
t(*table())[30];
替换t
,我们得到一个带有未指定数量的参数的函数,并返回一个指向30个指向int元素的数组的指针:
int*(*table())[30];
答案 2 :(得分:0)
该行:
int *(*table())[30];
声明" table是一个函数,返回一个指向指向int的30个指针数组的指针。"
有很多关于如何阅读C类型声明的好文章。 Here is one of them.
总结:
规则:
[]
和()
以及*
包围。称之为$ identifier。您的声明将模仿如下:$identifier
是...... $typename
。
以&#34开头; $ identifier是(n)"。
如果您可以通过使用[...]
或(...)
来做对,那么请将其添加到您的声明中。 [...]
是一个(可能是空的)数组声明,写成"数组(of ...)&#34 ;;而(...)
是一个(可能是空的)函数声明,写成"函数返回"或"功能服用(...)返回"。
如果你不能正确,因为你达到了分号,逗号或右括号,那么你必须向左走。向左移动,如果你在进程结束时消耗$ typename,或者使用指针声明(*
,写入"指向(")或使用左括号。在使用其中任何一个之后,除了$ typename之外,请尝试再次右转。
记住:如果可以的话,向右走,如果必须,请向左走。
您的问题,重新访问
考虑到这一点,让我们再看看:
int *(*table())[30];
一步一步:
以&#34开头; $ identifier是(n)":"表是(n)" ${typename} *(*${declaration}())[30];
向右走:" ...功能返回" ${typename} *(* ${declaration} )[30];
)
${typename} * ${declaration} [30];
${typename} * ${declaration};
;
${typename} * ${declaration}
${typename} ${declaration}
按顺序写下所有内容,然后得到:
table是一个(n)函数,返回指向30个指针到int的数组的指针
通过删除不需要的句子来清理句子,并用"指针替换单个指针":
table是一个返回指向指向int的30个指针数组的指针的函数。
答案 3 :(得分:0)
顺时针/螺旋规则可以理解上述声明。
下面介绍如何使用规则解析声明:
1) table 是一个带有未指定参数的函数。
2) table() 函数返回指针。
3) table()函数返回的指针指向 30 元素的数组。
4)每个元素的类型为 整数指针 ,即每个元素都指向一个整数。
有关该规则的更多信息,请参阅此链接:The ``Clockwise/Spiral Rule''
答案 4 :(得分:0)
标识符 table 是一个返回指向30个整数指针数组的指针的函数。作为学习所谓clockwise/spiral rule的补充,您可以使用http://cdecl.org/等网站查找。
如果我能够重写代码,我会将声明拆分为类型声明和函数声明。这样就可以更容易理解程序文本。我也会调用结果类型 Table 并为函数选择一个更具体的名称,这很可能会返回一种特殊的表格,例如 Foo 表。如果可能的话,我也会避免使用空参数列表并使用关键字 void 来指定该函数不带参数:
typedef int *(*Table)[30];
Table FooTable(void);