//先看一些函數指標的例子(吸納了網上兄弟的方法)
#include <stdio.h><br />void MyFun(int x); //這個申明也可寫成:void MyFun( int );<br />void (*FunP)(int ); //也可申明成void(*FunP)(int x),但習慣上一般不這樣。 </p><p>void MyFun(int x) //這裡定義一個MyFun函數<br />{<br /> printf("%d/n",x);<br />} </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這是直接調用MyFun函數<br /> Funp=&MyFun; //將MyFun函數的地址賦給FunP變數<br /> (*FunP)(20); //這是通過函數指標變數FunP來調用MyFun函數的。<br />}<br />............................<br />int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這裡是調用MyFun(10);函數<br /> FunP=&MyFun; //將MyFun函數的地址賦給FunP變數<br /> FunP(20); //這是通過函數指標變數來調用MyFun函數的。 </p><p> return 0;<br />}<br />................................ </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這是直接調用MyFun函數<br /> FunP=MyFun; //將MyFun函數的地址賦給FunP變數<br /> FunP(20); //這是通過函數指標變數FunP來調用MyFun函數的。<br />} </p><p>........................................ </p><p>int main(int argc, char* argv[])<br />{<br /> MyFun(10); //這裡是調用MyFun(10);函數<br /> FunP=MyFun; //將MyFun函數的地址賦給FunP變數<br /> (*FunP)(20); //這是通過函數指標變數來調用MyFun函數的。<br /> return 0;<br />}<br />.................<br />int main(int argc, char* argv[])<br />{<br /> (*MyFun)(10); //看,函數名MyFun也可以有這樣的調用格式 </p><p> return 0;<br />} </p><p>
函式宣告一般是這樣int fun(int,double);對應函數指標(pointer to function)的聲明
是這樣:
int (*pf)(int,double),你必須習慣。可以這樣使用:
pf = &fun;//賦值(assignment)操作
(*pf)(5, 8.9);//函數叫用作業
也請注意,C語言本身提供了一種簡寫方式如下:
pf = fun;// 賦值(assignment)操作
pf(5, 8.9);// 函數叫用作業
不過我本人不是很喜歡這種簡寫,它對初學者帶來了比較多的迷惑。
............................
1. 其實,MyFun的函數名與FunP函數指標都是函數指標。MyFun函數名是一個函數指標常量,而FunP是一個函數數指標變數,這是它們的關係。
2. 但函數名調用如果都得如(*MyFun)(10);這樣,那書寫與讀起來都是不方便和不習慣的。所以C語言的設計者們才會設計成又可允許MyFun(10);這種形式地調用(這樣方便多了並與數學中的函數形式一樣,不是嗎?)。
3. 為統一起見,FunP函數指標變數也可以FunP(10)的形式來調用。
4. 賦值時,即可FunP=&MyFun形式,也可FunP=MyFun。
請這樣理解吧!這可是有助於你對函數指標的應用嘍!
最後補充說明一點:在函數的申明處:
void MyFun(int ); //不能寫成void (*MyFun)(int )。
void (*FunP)(int );//不能寫成void FunP(int )。
(請看注釋)這一點是要注意的
另外可以用typedef來類取別名 比如 typedef void(*FunType)(int)
//這樣只是定義一個函數指標類型
函數指標數組:
void (*fun[256])(void);
fun[0] = function0;
……
fun[255] = function255;//切忌fun[255] = function255() ,因function255() 是函數傳回值了.
調用如下:
__int8 nStreamType = buffer[0];
(*fun[nStreamType])();