http://www.cnblogs.com/windlaughing/archive/2013/04/10/3012012.html
void myFun(int x);? ? //聲明也可寫成:void myFun( int );
int main()
{
myFun(100);//一般的函數(shù)調(diào)用
return 0;
}
void myFun(int x)
{
printf("myFun: %d\n",x);
}
函數(shù)指針變量的聲明:
void (*funP)(int) ; ? //聲明一個(gè)指向同樣參數(shù)、返回值的函數(shù)指針變量。
(整個(gè)函數(shù)指針變量的聲明格式如同函數(shù)myFun的聲明處一樣,只不過——我們把myFun改成(*funP)而已,這樣就有了一個(gè)能指向myFun函數(shù)的指針了。當(dāng)然,這個(gè)funP指針變量也可以指向所有其它具有相同參數(shù)及返回值的函數(shù)。)
#include#includevoid (*funP)(int);? //聲明也可寫成void(*funP)(int x),但習(xí)慣上一般不這樣。
void (*funA)(int);
void myFun(int x);? ? //聲明也可寫成:void myFun( int );
int main()
{
//一般的函數(shù)調(diào)用
myFun(100);
//myFun與funP的類型關(guān)系類似于int 與int *的關(guān)系。
funP=&myFun;? //將myFun函數(shù)的地址賦給funP變量
(*funP)(200);? //通過函數(shù)指針變量來調(diào)用函數(shù)
//myFun與funA的類型關(guān)系類似于int 與int 的關(guān)系。
funA=myFun;
funA(300);
//三個(gè)貌似錯(cuò)亂的調(diào)用
funP(400);
(*funA)(600);
(*myFun)(1000);
return 0;
}
void myFun(int x)
{
printf("myFun: %d\n",x);
}
總結(jié):
1、 其實(shí),myFun的函數(shù)名與funP、funA函數(shù)指針都是一樣的,即都是函數(shù)指針。myFun函數(shù)名是一個(gè)函數(shù)指針常量,而funP、funA是函數(shù)數(shù)指針變量,這是它們的關(guān)系。
2、但函數(shù)名調(diào)用如果都得如(*myFun)(10)這樣,那書寫與讀起來都是不方便和不習(xí)慣的。所以C語言的設(shè)計(jì)者們才會(huì)設(shè)計(jì)成又可允許myFun(10)這種形式地調(diào)用(這樣方便多了,并與數(shù)學(xué)中的函數(shù)形式一樣)。
3、 為了統(tǒng)一調(diào)用方式,funP函數(shù)指針變量也可以funP(10)的形式來調(diào)用。
4、賦值時(shí),可以寫成funP=&myFun形式,也可以寫成funP=myFun。
5、但是在聲明時(shí),void myFun(int )不能寫成void (*myFun)(int )。void (*funP)(int )不能寫成void funP(int )。
6、函數(shù)指針變量也可以存入一個(gè)數(shù)組內(nèi)。數(shù)組的聲明方法:int (*fArray[10]) ( int );