字符* (*名称())[];这个语句是函数指针数组吗?

char* (*name())[]; Is this statement array of function pointers?

这句话让我深思。我最终得到一个结论函数指针 returns 字符数组。但是我无法给自己正确的推理。

不是,是函数原型。函数返回指向 char * 指针数组的指针。函数采用未指定的参数

如果你想让函数指针返回指向char的指针数组,它必须像这样声明

 char* ((*name)())[];

声明呈现了某物将如何使用的“图片”。声明 char* (*name())[]; 表示 * (*name())[]char.

  • 那么(*name())[]就是一个指向char的指针。
  • 那么(*name())就是指向char的指针数组。
  • 那么*name()就是指向char的指针数组。
  • 那么name()就是指向char的指针数组的指针。
  • 那么name就是一个函数,returns一个指向char的指针数组的指针。
char* (*name())[];

使用此语句,您声明了一个名为 name 的函数,该函数允许接受任何参数和 returns 指向指向 char 的指针数组的指针,而不是函数指针returns char 的数组。

是函数name的声明或"prototype"。

请注意,为了在源代码中使用 name,您还需要函数 name 的定义(函数实际在做什么)。

如果您想确定某种类型的 C 构造,您可以使用 Ross J. Anderson 制作的 Clockwise/Spiral Rule made by David Anderson; but not to confuse with Anderson`s Rule,这是非常独特的东西。

这样的变量声明按照运算符优先级.

从里​​到外读取

在这种情况下:

  • name 是...的名称...
  • name()函数(优先级,()运算符的优先级高于*运算符!),其中returns一个...
  • *name() 指向 ...
  • 的指针
  • (*name())[] 数组(优先级,[] 运算符的优先级高于 * 运算符!)...
  • *(*name())[] 指向...
  • char*(*name())[] 个字符。

这基本上等同于 Eric Postpischil 的方法,但它更清楚地显示了运算符优先级发挥作用的地方。

顺便说一句:一旦您理解了这个变量声明,C 语言中就没有您无法理解的变量声明。

这样读(使用Clockwise/Spiral规则):

char* (*name())[];

1) 找到标识符。

char* (*name())[];
        ^^^^

"name is a"

2) 向右移动。

char* (*name())[];
            ^^

"name is a function accepting any parameter and returning"

3) 因为右括号不能再向右移动,所以向左移动。

char* (*name())[];
       ^

"name is a function accepting any parameter and returning pointer to"

4) 因为左括号不能再向左移动,所以继续 正确的。

char* (*name())[];
               ^^

"name is a function accepting any parameter and returning pointer to an array"

5) 不能再向右移动了,因为我们没有符号了,所以向左走。

char* (*name())[];
    ^

"name is a function accepting any parameter and returning pointer to an array of pointers to"

6) 最后,继续向左走,因为右边什么都没有了。

char* (*name())[];
^^^^

"name is a function accepting any parameter and returning pointer to an array of pointers to char".