來自:百度百科
函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。如前所述,C在編譯時,每一個函數(shù)都有一個入口地址,該入口地址就是函數(shù)指針所指向的地址。有了指向函數(shù)的指針變量后,可用該指針變量調用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是一致的。函數(shù)指針有兩個用途:調用函數(shù)和做函數(shù)的參數(shù)。
1. 函數(shù)指針聲明方法:
【數(shù)據(jù)類型】【*】【指針變量名】(形參列表);
注1:“函數(shù)類型”說明函數(shù)的返回類型,由于“()”的優(yōu)先級高于“*”,所以指針變量名外的括號必不可少,后面的“形參列表”表示指針變量指向的函數(shù)所帶的參數(shù)列表。例如:
int func(int x); /* 聲明一個函數(shù) */
int (*f) (int x); /* 聲明一個函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。
注2:函數(shù)括號中的形參可有可無,視情況而定。
下面的程序說明了函數(shù)指針調用函數(shù)的方法:
#include <iostream>
using namespace std;
int max(int x,int y){return (x>y?x:y);}
int main()
{
int (*ptr)(int,int );
int a,b,c;
ptr=max;
cin>>a>>b;
c=(*ptr)(a,b);
cout<<c<<endl;
return 0;
}
ptr是指向函數(shù)的指針變量,所以可把函數(shù)max()賦給ptr作為ptr的值,即把max()的入口地址賦給ptr,以后就可以用ptr來調用該函數(shù),實際上ptr和max都指向同一個入口地址,不同就是ptr是一個指針變量,不像函數(shù)名稱那樣是死的,它可以指向任何函數(shù),就看你想怎么做了。在程序中把哪個函數(shù)的地址賦給它,它就指向哪個函數(shù)。而后用指針變量調用它,因此可以先后指向不同的函數(shù)。不過注意,指向函數(shù)的指針變量沒有++和--運算,用時要小心。
2.指針函數(shù)和函數(shù)指針的區(qū)別:
1,這兩個概念都是簡稱,指針函數(shù)是指帶指針的函數(shù),即本質是一個函數(shù)。我們知道函數(shù)都又有返回類型(如果不返回值,則為無值型),只不過指針函數(shù)返回類型是某一類型的指針。
其定義格式如下所示:
【返回類型標識符】【 *】【返回名稱】(形式參數(shù)表)
{ 函數(shù)體 }
返回類型可以是任何基本類型和復合類型。返回指針的函數(shù)的用途十分廣泛。事實上,每一個函數(shù),即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。比如函數(shù)返回一個整型值,實際上也相當于返回一個指針變量的值,不過這時的變量是函數(shù)本身而已,而整個函數(shù)相當于一個“變量”。
3.關于函數(shù)指針數(shù)組的定義
關于函數(shù)指針數(shù)組的定義方法,有兩種:一種是標準的方法;一種是蒙騙法。
第一種,標準方法:
函數(shù)指針數(shù)組是一個其元素是函數(shù)指針的數(shù)組。那么也就是說,此數(shù)據(jù)結構是一個數(shù)組,且其元素是一個指向函數(shù)入口地址的指針。
根據(jù)分析:首先說明是一個數(shù)組:數(shù)組名[]
其次,要說明其元素的數(shù)據(jù)類型指針:*數(shù)組名[].
再次,要明確這每一個數(shù)組元素是指向函數(shù)入口地址的指針:函數(shù)返回值類型 (*數(shù)組名[])().請注意,這里為什么要把“*數(shù)組名[]”用括號擴起來呢?因為圓括號和數(shù)組說明符的優(yōu)先級是等同的,如果不用圓括號把指針數(shù)組說明表達式擴起來,根據(jù)圓括號和方括號的結合方向,那么 *數(shù)組名[]() 說明的是什么呢?是元素返回值類型為指針的函數(shù)數(shù)組。有這樣的函數(shù)數(shù)祖嗎?不知道。所以必須括起來,以保證數(shù)組的每一個元素是指針。
第二種,蒙騙法:
盡管函數(shù)不是變量,但它在內存中仍有其物理地址,該地址能夠賦給指針變量。獲取函數(shù)地址的方法是:用不帶有括號和參數(shù)的函數(shù)名得到。
函數(shù)名相當于一個指向其函數(shù)入口指針常量。 那么既然函數(shù)名是一個指針常量,那么就可以對其進行一些相應的處理,如強制類型轉換。
那么我們就可以把這個地址放在一個整形指針數(shù)組中,然后作為函數(shù)指針調用即可。
完整例子:
#include <iostream>
int add1(int a1,int b1);
int add2(int a2,int b2);
int main()
{
int numa1=1,numb1=2;
int numa2=2,numb2=3;
int (*op[2])(int a,int b);
op[0]=add1;
op[1]=add2;
printf("%d ,%d\n",op[0](numa1,numb1),op[1](numa2,numb2));
system("PAUSE");
return 0;
}
int add1(int a1,int b1)
{
return a1+b1;
}
int add2(int a2,int b2)
{
return a2+b2;
}