螺旋规则和'声明遵循用法'来parsingC和C ++声明

这个问题是关于C声明的另一个问题 。 读到这个问题的答案,我读了关于螺旋规则 ,我也明白了“申报遵循使用”是什么意思。

好吧,至今。 但后来我读到这个声明 :

char *(*(*a[N])())(); 

我想知道如何用“声明遵循使用”的“规则”来parsing它。 特别是对于数组部分。

我读的是:

 (*(*a[N])()) 

是一个函数()返回一个char * ,然后,解引用以下

 (*a[N])() // 1 

是这个'函数返回一个char* ',所以1是一个'指向返回char *的函数的指针',那么我会说'当(*a[N])被调用时,它是[先前的声明]'。 在这一点上,我们有(*a[N])是一个返回指向返回char *的函数的指针的函数。

但是,我不知道如何应用这个规则来区分'指针数组'和'指针数组'。

有人可以澄清这一点?

其他问题:在这样的声明中,在(在C ++), *[]之间的“优先级”是什么? [也许“优先”不是正确的名词]


为了检查我是否正确理解了“螺线规则”,我也在下面parsing这个expression式。 请告诉我,如果我错了。

  +-----------+ | +------+ | | | +-+ | | | | ^ | | | char* (*(* a[N])())(); ^ ^ ^ ^ ^ ^ | | | | | | | | +---+ | | | +--------+ | +--------------+ 

对我来说更容易(循环循环):

  • a是N的数组…
  • 指向函数返回的指针
  • 指向函数返回的指针
  • char *

但是我可能错过了一些让我得到正确答案的东西,但在另一个更复杂的情况下可能是错误的。

你只需要逐步build立起来。

 char *X(); // X =~ (*(*a[N])()) 

函数返回char*

 char *(*Y())(); // Y =~ (*a[N]) 

函数返回指向返回char*函数的指针

在一个声明中,就像在一个expression式(声明遵循使用)中一样,postfix []具有更高的优先级,所以一元* so *a[N]等于*(a[N]) ,而不是(*a)[N]

 char *(*(*Z)())(); // Z =~ a[N] 

指向函数的指针返回指向返回char*函数的指针。

 char *(*(*a[N])())(); 

包含N个指向函数返回指向返回char*函数的指针的数组。