这个问题是关于C语言声明的,与另一个问题有关。在阅读这个问题的答案时,我了解了spiral rule,并且也明白了“声明跟随使用”的含义。
到目前为止还好。但是接着我读到了这个声明:
char *(*(*a[N])())();
我想知道如何使用“声明跟随使用”原则来解析它,特别是数组部分。
我所读到的内容是:
(*(*a[N])())
这是一个返回 char *
类型的函数()
,然后对其进行解引用。
(*a[N])() // 1
这是一个“返回char指针的函数”,因此1是“返回char指针的函数的指针”,那么我会说,“当调用(*a [N])时,它就是[先前的声明]”。现在我们有(*a [N])是一个返回指向返回char指针的函数的指针的函数。但是我不知道如何应用此规则来区分“指向数组”的指针和“数组”的指针。
还有一个问题:在这样的声明中,“&”(在C ++中)、“*”和“[]”之间的“优先级”规则是什么?[也许“优先级”不是正确的术语]
为了检查我是否正确理解了“螺旋规则”,我也解析了下面的表达式,请告诉我如果我错了。
+-----------+
| +------+ |
| | +-+ | |
| | ^ | | |
char* (*(* a[N])())();
^ ^ ^ ^ ^ ^
| | | | | |
| | +---+ | |
| +--------+ |
+--------------+
对我而言,(逐个循环)更容易:
a
是一个长度为N的数组...- 指向返回...的函数指针
- 指向返回...的函数指针
char *
但我可能会忽略某些情况,在这种情况下,让我得到正确答案,但在另一种更复杂的情况下也可能是错误的。
&
的提及。 - Jonathan Leffler