先放大招: cdecl: C gibberish ↔ English

简单地说有如下5条规则:

  1. [N] or [] 拥有N个或不确定个数元素的数组, 元素类型为…
  2. (type_a, type_b) 接受type_a, type_b, …参数的函数, 返回类型为…
  3. * 指针, 指向类型为…
  4. 优先级 [] > *, () > *
  5. 括号永远优先

看个蜜汁的例子: int *(*p[])(int)

先从最内层看起:

  1. []优先级较高, p[]: p是一个数组, 元素的类型为…
  2. *p[]: 元素的类型为指针, 指向类型为…
  3. ()优先级较高, (*p[])(int): 指向类型为一个接受int的函数, 返回类型为…
  4. *(*p[])(int): 返回类型为一个指针, 指向类型为…
  5. int *(*p[])(int): 指向类型为int

结论:

p是一个数组, 元素的类型为指针, 指向类型为一个接受int的函数, 返回类型为一个指针, 指向类型为int

这里有一篇更为详细的解释, 介绍了顺时针法, 给出了很多例子, 可以参考一下: Clockwise/Spiral Rule

不过遇到这么麻复杂的类型还是多用typedef吧…