螺旋规则和'声明遵循用法'来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*
函数的指针的数组。