int *( *(*fp1)(int) )[10];
阅读步骤:
1. 从变量名开始 ---------------------------- fp1
2. 往右看,是“)”,因此往左看,是“*” ------- 一个指针
3. 跳出括号,碰到了(int) ------------ 一个带一个int参数的函数
4. 向左看,发现一个* ---------------------(函数)返回一个指针
5. 跳出括号,向右看,碰到[10] ------------- 一个10元素的数组
6. 向左看,发现一个* ----------------------- 指针
7. 向左看,发现int ----------------------- int类型
p是一个指针,指向一个函数,函数参数为int型,函数返回一个指针,指向一个数组(10个元素),数组里面保存int*。
union sign *(*var[5])[5];
var声明了一个指针数组,指针指向一个union sign指针的数组(5个元素)。
const char * const * const p8;
p8是一个const指针,指向一个const指针pa,pa指针指向const char类型。
char (* (*x[3]) () ) [5]
x是一个数组,包含3个函数指针,函数指针返回一个指向char[5]的指针。
char *(* c[10])(int **)
c是一个函数指针数组,参数为int**(指向int指针的指针),返回值为char*。
unsigned int *(* const *name[5][10] ) ( void );
name是一个2维数组(5×10),保存的是指向const型函数指针的指针,函数指针返回值为UINT指针。
关于如何解析复杂的声明,可以参考前面提到的相关文档。其中C专家编程里面提到了一个人机皆可使用的规则。
A 声明从名字开始读取,然后按照优先级依次读取。
B 优先级从高到低依次为:
B1 被括号括起来的部分
B2 声明后缀符, 括号表示是一个函数,方括号【】表示是一个数组。
B3 前缀操作,*表示“指向…的指针”
C 如果const和(或)volatile关键字后面紧跟类型说明符(如int long double),那么它作用于类型说明符。在其他情况下const volatile关键字作用于它左边紧邻的指针星号。