對於乙個函式:
void func(void);
我們通常可以定義乙個這樣的函式指標指向它:
void (*p)(void) = func;
通過p呼叫func時,通常有兩種寫法:
p();或者(*p)();
圍繞這兩種寫法,當初c89制定的時候曾經有過爭論。(*p)();是一種舊式的規定,舊式規定圓括號左邊必須具有「函式」型別,如果是指向函式的指標,那麼必須加上*宣告符。但c89不再把圓括號的左邊限定為「函式」型別,而是乙個字尾表示式。那麼問題就來了,如果p的值是函式位址,那麼*號就是宣告符,但如果p指向的內容是函式位址,*號就得被看作運算子了。同一種形式會有兩種解釋,這是乙個矛盾。不僅函式呼叫如此,指向陣列的指標也存在這種矛盾。編譯器為了處理這種情況得增加**,效率自然就降低了。爭論的最後結果是誰也不能把對方完全說服,於是就乾脆兩種都支援了。筆者認為應該拋棄舊式的規定,p();這種形式簡潔明瞭,又符合函式的一般形式,何樂而不為?
第八章練習的答案,同時給出用typedef的分解方法:
int (*(*func)[5][6])[7][8];
func是乙個指向陣列的指標,這類陣列的元素是乙個具有5x6個int元素的二維陣列,而這個二維陣列的元素又是乙個二維陣列。
typedef int (*para)[7][8];
typedef para (*func)[5][6];
int (*(*(*func)(int *))[5])(int *);
func是乙個函式指標,這類函式的返回值是乙個指向陣列的指標,所指向陣列的元素也是函式指標,指向的函式具有int*形參,返回值為int。
typedef int (*para1)(int*);
typedef para1 (*para2)[5];
typedef para2 (*func)(int*);
int (*(*func[7][8][9])(int*))[5];
func是乙個陣列,這個陣列的元素是函式指標,這類函式具有int*的形參,返回值是指向陣列的指標,所指向的陣列的元素是具有5個int元素的陣列。
typedef int (*para1)[5];
typedef para1 (*para2)(int*);
typedef para2 func[7][8][9];
第十章 圍繞p 與 p 的爭論
對於乙個函式 void func void 我們通常可以定義乙個這樣的函式指標指向它 void p void func 通過p呼叫func時,通常有兩種寫法 p 或者 p 圍繞這兩種寫法,當初c89制定的時候曾經有過爭論。p 是一種舊式的規定,舊式規定圓括號左邊必須具有 函式 型別,如果是指向函式的...
第十章 圍繞p 與 p 的爭論
對於乙個函式 void func void 我們通常可以定義乙個這樣的函式指標指向它 void p void func 通過p呼叫func時,通常有兩種寫法 p 或者 p 圍繞這兩種寫法,當初c89制定的時候曾經有過爭論。p 是一種舊式的規定,舊式規定圓括號左邊必須具有 函式 型別,如果是指向函式的...
第十章 函式
使用def關鍵字 定義個數可變的位置形參 定義個數可變的關鍵字形參 定義預設值引數 定義個數可變的位置形參 deffun1 args 結果為乙個元組 print args fun1 10,20,30 10,20,30 定義個數可變的關鍵字形參 deffun2 args 結果為乙個字典 print a...