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。