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

时间:2016-05-11 06:50:24

标签: c

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

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

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

5 个答案:

答案 0 :(得分:5)

你可以从里到外解码:

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

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

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

答案 1 :(得分:3)

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

然后宣言变为:

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.

总结:

规则:

  1. 左侧有一个类型名称。称之为$ typename。
  2. 右侧某处有一个标识符,可能被[]()以及*包围。称之为$ identifier。
  3. 您的声明将模仿如下:$identifier是...... $typename

    1. 以&#34开头; $ identifier是(n)"。

    2. 如果您可以通过使用[...](...)来做对,那么请将其添加到您的声明中。 [...]是一个(可能是空的)数组声明,写成"数组(of ...)&#34 ;;而(...)是一个(可能是空的)函数声明,写成"函数返回"或"功能服用(...)返回"。

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

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

    4. 您的问题,重新访问

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

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

      一步一步:

      1. $ typename =" int"
      2. $ identifier =" table&#34 ;;
      3. 以&#34开头; $ identifier是(n)":"表是(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"
      12. 按顺序写下所有内容,然后得到:

          

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

        通过删除不需要的句子来清理句子,并用"指针替换单个指针":

          

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

答案 3 :(得分:0)

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

enter image description here

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

  

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);