1 int get_max(int i, int j, int k, int (*pt)(int,int))
2 {
3 int ret;
4
5 ret = pt(i,j);
6 // ret = (*pt)(i,j);
7
8 return ret;
9 }
沒接觸過,函數指針可以這樣用,第一感覺應該是第六行所示的使用方式;懷疑是其書寫錯誤,后來在實際在電腦上測試了下,結果是正確的,這兩種方式都能成功運行。。。。。
又去翻了K&R求證一下,并沒提到用函數指針名直接調用函數這種方式。自己也開始糾結了,自己接著又對程序調試了一番,看下pt與*pt的值是否一樣,如期待的那樣是一樣的,不一樣程序肯定不能正確運行,看來是編譯器在編譯的時候對函數指針變量pt與*pt是做相同值處理,pt就等于*pt;
最后在網上看到一篇好文,詳細的講述了函數名與函數指針的關系。
原文:《徹底搞定C指針-函數名與函數指針》
void MyFun(int x); //這個申明也可寫成:void MyFun( int );
void (*FunP)(int ); //也可申明成void(*FunP)(int x),但習慣上一般不這樣。
結論:
1. 其實,MyFun的函數名與FunP函數指針都是一樣的,即都是函數指針。MyFun函數名是一個函數指針常量,而FunP是一個函數數指針變量,這是它們的關系。
2. 但函數名調用如果都得如(*MyFun)(10);這樣,那書寫與讀起來都是不方便和不習慣的。所以C語言的設計者們才會設計成又可允許MyFun(10);這種形式地調用(這樣方便多了并與數學中的函數形式一樣,不是嗎?)。
3. 為統(tǒng)一起見,FunP函數指針變量也可以FunP(10)的形式來調用。
4. 賦值時,即可FunP=&MyFun形式,也可FunP=MyFun。