螺旋规则和'声明跟随用法'用于解析C和C++声明

Ced*_* H. 17 c c++ declaration

这个问题遵循关于C声明的另一个问题.阅读这个问题的答案,我读到了螺旋规则,我也理解了"声明遵循用法"的含义.

好到目前为止.但后来我读到了这个宣言:

char *(*(*a[N])())(); 
Run Code Online (Sandbox Code Playgroud)

我想知道如何用"声明跟随用法""规则"来解析它.特别是对于阵列部分.

我读到的是:

(*(*a[N])()) 
Run Code Online (Sandbox Code Playgroud)

是一个()返回a 的函数char *,然后解除引用以下内容

(*a[N])() // 1
Run Code Online (Sandbox Code Playgroud)

这是'函数返回char*',所以1是'返回函数的指针char *'然后我会说'何时(*a[N])被调用,它是[先前的声明]'.此时我们有(*a[N])一个返回指向返回函数的指针的函数char *.

但后来我不知道如何应用这个规则来区分"指向数组的指针"和"指针数组".

有人可以澄清一下吗?

其他问题:这些声明中的"优先级"规则是什么,&(在C++中)*,和[]?[也许"优先"不是正确的术语]


为了检查我是否正确理解了'螺旋规则',我也在下面解析这个表达式; 请告诉我,如果我错了.

       +-----------+
       | +------+  |
       | | +-+  |  |
       | | ^ |  |  |
char* (*(* a[N])())(); 
    ^  ^ ^   ^  ^  ^
    |  | |   |  |  |
    |  | +---+  |  |
    |  +--------+  |
    +--------------+
Run Code Online (Sandbox Code Playgroud)

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

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

但我可能会遗漏一些在这种情况下让我获得正确答案但在另一个更复杂的案例中可能是错误的.

CB *_*ley 13

你只需要逐步建立起来.

char *X();  // X =~ (*(*a[N])())
Run Code Online (Sandbox Code Playgroud)

功能返回 char*

char *(*Y())();  // Y =~ (*a[N])
Run Code Online (Sandbox Code Playgroud)

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

在声明,正如在表达式(声明后续使用),后缀[]具有更高的优先级即一元*,以便*a[N]等同于*(a[N]),不(*a)[N].

char *(*(*Z)())();  // Z =~ a[N]
Run Code Online (Sandbox Code Playgroud)

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

char *(*(*a[N])())();
Run Code Online (Sandbox Code Playgroud)

指向返回函数返回指针的函数的N个指针数组char*.