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