C语言中复杂声明的解释方法

来源:互联网 发布:武士道知乎 编辑:程序博客网 时间:2024/05/28 23:19

首先考虑,下面这个声明符是什么意思呢?

int *(*x[10])(void);

这个声明符组合了 *, [] 和 (),所以 x 是指针、数组还是函数并不明显。
幸运的是,无论多么费解,有下面两条简单的规则可以用来理解任何声明。

  • 始终从内往外读声明符。换句话说,定位声明的标识符,并且从此处开始解释声明。
  • 在做选择时,始终使[]和()优先于* 如果*在标识符的前面,而标识符后边跟着[],那么标识符表示数组而不是指针。同样的,如果*在标识符的前面,而标识符后面跟着 () , 那么标识符表示函数而不是指针。(当然,可以使用圆括号来使 [] 和 () 相对于 * 的优先级无效。)

下面使用这种方法来解释早前给出的声明:

int *(*x[10])(void);

首先,定位声明的标识符 (x)。在x前有*,而后面又跟着[]。因为[]的优先级高于*,所以取右侧(x是数组)。接下来,从左侧找到数组中元素的类型(指针)。再接下来,到右侧找到指针所指向的数据类型(不带实际参数的函数)。最后,回到左侧看每个函数返回的内容(指向int型的指针)。