一個一般的函數調用的例子:
//聲明(通常頭文件中)
void MyFun(int x); //此處的申明也可寫成:void MyFun( int );
int main(int argc, char* argv[])
{
MyFun(10); //這裏是調用MyFun(10);函數
return 0;
}
void MyFun(int x) //這裏定義一個MyFun函數
{
printf(「%d\n」,x);
}html
就像某一數據變量的內存地址能夠存儲在相應的指針變量中同樣,函數的首地址也以存儲在某個函數指針變量裏的。這樣,就能夠經過這個函數指針變量來調用所指向的函數了。在C系列語言中,任何一個變量,老是要先申明,以後才能使用的。以上面的例子爲例,我來申明一個能夠指向MyFun函數的函數指針變量FunP。下面就是申明FunP變量的方法函數
void (*FunP)(int) ; spa
也可寫成void (*FunP)(int x);整個函數指針變量的申明格式如同函數MyFun的申明處同樣,只不過把MyFun改爲(*FunP)而已,這樣就有了一個能指向MyFun函數的指針FunP了。設計
有了FunP指針變量後,咱們就能夠對它賦值指向MyFun,而後經過FunP來調用MyFun函數了。看我如何經過FunP指針變量來調用MyFun函數的:
//包含頭文件裏面的聲明
void MyFun(int x); //這個申明也可寫成:void MyFun( int );
void (*FunP)(int ); //也可申明成void(*FunP)(int x),但習慣上通常不這樣。
int main(int argc, char* argv[])
{
MyFun(10); //這是直接調用MyFun函數
FunP=&MyFun; //將MyFun函數的地址賦給FunP變量
(*FunP)(20); //這是經過函數指針變量FunP來調用MyFun函數的。
}
void MyFun(int x) //這裏定義一個MyFun函數
{
printf(「%d\n」,x);
}指針
函數指針也可以下使用,來完成一樣的事情:
//包含頭文件裏面的聲明
void MyFun(int x);
void (*FunP)(int ); //申明一個用以指向一樣參數,返回值函數的指針變量。
int main(int argc, char* argv[])
{
MyFun(10); //這裏是調用MyFun(10);函數
FunP=MyFun; //將MyFun函數的地址賦給FunP變量
FunP(20); //這是經過函數指針變量來調用MyFun函數的。
return 0;
}
void MyFun(int x) //這裏定義一個MyFun函數
{
printf(「%d\n」,x);
}htm
1. 其實,MyFun的函數名與FunP函數指針都是同樣的,即都是函數指針。MyFun函數名是一個函數指針常量,而FunP是一個函數數指針變量,這是它們的關係。
2. 但函數名調用若是都得如(*MyFun)(10);這樣,那書寫與讀起來都是不方便和不習慣的。因此C語言的設計者們纔會設計成又可容許MyFun(10);這種形式地調用(這樣方便多了並與數學中的函數形式同樣,不是嗎?)。
3. 爲統一塊兒見,FunP函數指針變量也能夠FunP(10)的形式來調用。
4. 賦值時,便可FunP=&MyFun形式,也可FunP=MyFun。內存
所以,如下的代碼也是可行的數學
代碼之三:
int main(int argc, char* argv[])
{
MyFun(10); //這裏是調用MyFun(10);函數
FunP=&MyFun; //將MyFun函數的地址賦給FunP變量
FunP(20); //這是經過函數指針變量來調用MyFun函數的。
return 0;
}
代碼之四:
int main(int argc, char* argv[])
{
MyFun(10); //這裏是調用MyFun(10);函數
FunP=MyFun; //將MyFun函數的地址賦給FunP變量
(*FunP)(20); //這是經過函數指針變量來調用MyFun函數的。
return 0;
}class
既然函數指針變量是一個變量,固然也能夠做爲某個函數的參數來使用的。因此,你還應知道函數指針是如何做爲某個函數的參數來傳遞使用的。
如下設計一個CallMyFun函數,這個函數能夠經過參數中的函數指針值不一樣來分別調用MyFun一、MyFun二、MyFun3這三個函數(注:這三個函數的定義格式應相同)。
實現:代碼以下:
//自行包含頭文件
void MyFun1(int x);
void MyFun2(int x);
void MyFun3(int x);
typedef void (*FunType)(int ); //②. 定義一個函數指針類型FunType,與①函數類型一致
void CallMyFun(FunType fp,int x);
int main(int argc, char* argv[])
{
CallMyFun(MyFun1,10); //⑤. 經過CallMyFun函數分別調用三個不一樣的函數
CallMyFun(MyFun2,20);
CallMyFun(MyFun3,30);
}
void CallMyFun(FunType fp,int x) //③. 參數fp的類型是FunType。
{
fp(x);//④. 經過fp的指針執行傳遞進來的函數,注意fp所指的函數是有一個參數的
}
void MyFun1(int x) // ①. 這是個有一個參數的函數,如下兩個函數也相同
{
printf(「函數MyFun1中輸出:%d\n」,x);
}
void MyFun2(int x)
{
printf(「函數MyFun2中輸出:%d\n」,x);
}
void MyFun3(int x)
{
printf(「函數MyFun3中輸出:%d\n」,x);
}變量
摘錄:http://www.360doc.com/content/12/0528/10/1317564_214195777.shtml