【C/C++学习】之七、指向函数的指针
什么是指向函數的指針
函數指針是指向函數的指針變量,不是指向對象的指針!函數指針本身應該是“指針變量”;
“在C語言中,函數本身不是變量,但可以定義指向函數的指針,這種指針可以被賦值、存放于數組之中,傳遞給函數及作為函數的返回值等” --《The C Programming Language Second Edition》
一個函數在編譯的時候被分配一個入口地址,這個入口地址就稱為函數指針。就一個函數來說,他做兩件事,1、調用它。2、取得他的地址。 當你通過取得函數的地址來得到指針,那你就可以用這個指針來調用函數了!
下面來看一個實例:
bool (*pf)(const string &, const string &)
這里pf聲明是一個指向函數的指針。參數是兩個const string &類型和bool類型的返回值!
OK繼續看:
void a(int);void (*b)(int);b = a;//b = &a; //等效的 效果一樣
當然要知道的是,指向函數的指針的聲明你必須也要給出參數,跟函數聲明是一樣的,通過上面的實例會看出來的。 你調用函數的時候,參數也要完全匹配。 下面的應用中會給出實例;
下面我們來看一下用typedef來簡化:
我們來簡化一下函數指針;
typedef int (*ta)(int a);在這里,ta 是一種指向函數的指針類型的名字。 ? 你要使用這個函數指針的時候,你只需要直接使用tf 就可以了。
如: ?tf af = 0;
? ? ? ? ?tf bf = a;
就像這樣。
void sub ( int ( *x1) (int), int (*x2) (int,int) ){int a,b,i,j;a = (*x1)(i); /* 調用 f1 函數 */b = (*x2)(i)(j); /* 調用 f2 函數 */}
我們也可以通過指針來調用函數,在下面的如何使用函數指針那里我們會看到實例。
下面再來看一下 ?返回函數的指針。
int (*ff(int))(int *, int);
這個有點難理解了,我們要從里往外看:
ff(int) ? 這里將ff聲明為一個函數,它有一個int的形參。 ?
這個函數的返回值就是int (*)(int *, int);
這是一個指向函數的指針。我們來變一下形式:
typedef int (*func)(int*, int);? func ff(int)
最后看一下重載函數的指針:
void ff(string); void ff(int);void (*pf1)(int) = &ff;
指針的類型必須與重載函數的一個版本精確匹配。如果沒有匹配那么對這個指針的初始化或者賦值豆漿導致編譯錯誤;
最后要注意的是,指向函數的指針沒有++ ? --運算符;
指向函數的指針如何使用
#include<iostream> using namespace std;int max(int a, int b)//來定義一個函數 {if (a > b){return a;}else{return b;} }int main() {typedef int (*tf)(int a, int b); //tf是別名int (*f)(int a, int b);//f是函數指針int a, b, c;f = &max;//賦值 &這個符號有沒有都可以tf af = max;//初始化 賦值cin >> a >> b;c = (*f)(a, b);//調用cout << c << endl;c = af(a, b);//調用cout << c << endl;return 0;}指針函數和函數指針
指針函數是指返回值是指針的函數,即本質是一個函數。而函數指針在上文我們已經介紹了那么多了!
事實上,每一個函數,即使它不帶有返回某種類型的指針,它本身都有一個入口地址,該地址相當于一個指針。
2012/8/20
jofranks于南昌
轉載于:https://www.cnblogs.com/java20130723/archive/2012/08/20/3211409.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【C/C++学习】之七、指向函数的指针的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 内核协助的探测
- 下一篇: [转]c++模板