C函數指針

 一個一般的函數調用的例子:
//聲明(通常頭文件中)
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

相關文章
相關標籤/搜索