1、方法也是有类型的,方法的类型由返回类型和形参表决定。比如int F (int)的类型就是去掉方法名,int (int)。
2、对于方法类型,在返回类型和形参表之间,加上一个名称F,就表示一个特定的方法F。
3、思考,如果我在返回类型和形参表之间,加上一个指针变量呢?
表示指向这一类方法的指针。即int (*P) (int),需要特别注意的是,必须使用括号把*P括起来。如果没有括起来,int *P(int),从编译器的角度理解,就变成了返回int指针的方法声明。
4、那么接着思考,方法指针也是指针,既然方法能够返回其他指针,当然也可以返回方法指针。
方法指针的类型就是去掉指针名称,int(*)(int)。从人的角度思考,返回方法指针的方法应该是 int(*)(int) H(int)。但是,我们应该从编译器的角度思考,编译器首先找到方法名,去掉方法名和形参表,剩下的就是返回类型了。因此,实际的写法是int (* H(int)) (int)。
为了便以理解,使用
typedef int(*PF)(int);
PF H (int)。
5、接着考虑,方法指针数组的声明,从人的角度思考,应该是int(*) (int) a[10]; 实际上是 int(* a[10])(int)。
6、接着考虑,指向数组的指针,从人的角度思考,应该是int[10] *p; 实际上是int (*p)[10]。
7、可以认为,编译器并不是从左到右读取声明,而是声明的对象放在了中间,并用括号括起来,保证优先级最高,去掉名称,剩下的就是类型。
8、特别注意,复杂的声明是非常糟糕的编码风格,严重影响代码的可读性,应该尽量避免,可以使用typedef。