【转载】恼人的函数指针(一)
本文轉(zhuǎn)載自:
http://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html#undefined>
這篇是為了加深記憶所寫。發(fā)現(xiàn),很多知識(shí)若不經(jīng)過反復(fù)的琢磨和動(dòng)手實(shí)踐,是很難記得住的。
1) 函數(shù)指針的初始化。
函數(shù)如下:
int CompareString(const string& str1, const string& str2){return str1.compare(str2); }函數(shù)的初始化有兩種方式:
第一種,也是最普遍的方式:
int (*CompareFunction)(const string&, const string&) = CompareString;第二種,是使用typedef定義函數(shù)類型,這種寫法有助于對(duì)代碼的理解:
typedef int (*CompareFunctionType)(const string&, const string&); CompareFunctionType CompareFunction = CompareString;2) 函數(shù)指針賦值。
函數(shù)名可以理解為該類型函數(shù)的指針。當(dāng)然,取地址操作符作用于函數(shù)名上也能產(chǎn)生指向該類型函數(shù)的指針。也就是說下面兩種賦值都是可行的:
CompareFunctionType CompareFunction = CompareString; CompareFunctionType CompareFunction = &CompareString;3) 函數(shù)調(diào)用。
無論是用函數(shù)名調(diào)用,還是用函數(shù)指針調(diào)用,還是用顯式的指針符號(hào)調(diào)用,其寫法是一樣的:
CompareString("abc", "cba"); CompareFunction("abc", "cba"); (*CompareFunction)("abc", "cba");4) 函數(shù)指針的數(shù)組。
對(duì)于函數(shù)指針的數(shù)組,強(qiáng)烈建議使用typedef方式定義類型之后再使用,不然影響代碼的閱讀性,繼續(xù)以以上例子為例:
//without typedefint (*CompareFunctionArray[3])(const string&, const string&);//with typedefCompareFunctionType CompareFunctionTypeArray[3];5) 函數(shù)指針用做函數(shù)返回值的類型。
到這一步,會(huì)發(fā)現(xiàn)typedef是多么的好用了。不然我是完全讀不懂下面語句的意思的:
//without typedefint (*func(int*, int))(const string&, const string&);上面的聲明,將func(int*, int)聲明為一個(gè)函數(shù),返回值為函數(shù)指針,函數(shù)類型為 int (*)(const string&, const string&)。
多么的晦澀啊!
如果寫成typedef就不用這么糾結(jié)了,足見typedef的作用:
CompareFunctionType func(int*, int);6) 指向extern “C”函數(shù)的指針。
《C++ primer 3》中有指出,指向C函數(shù)的指針和指向C++函數(shù)的指針類型不同,但是現(xiàn)在的很多編譯器都有語言擴(kuò)展,認(rèn)為這兩種函數(shù)的指針具有相同的特性。
所以,我在vs 2010中做了嘗試,結(jié)果證明是支持這種語言擴(kuò)展的。
函數(shù)聲明如下:
復(fù)制代碼
函數(shù)指針的初始化和調(diào)用,允許賦值為指向C函數(shù)的指針:
int (*CompareFunction)(const string&, const string&) = InsideFunctionC;另外還有一點(diǎn),當(dāng)extern “C”應(yīng)用在一個(gè)聲明上時(shí),所有被它聲明的函數(shù)都將受到影響。舉個(gè)例子:
extern "C" void OutSideFunction(int (*fc)(const string&, const string&)) {cout<<fc("abc", "cba")<<endl;; }這里的OutSideFunction和fc都將受到extern “C”的影響,但是vs2010編譯器是支持一個(gè)指向C++函數(shù)的指針作為OutSideFunction的參數(shù)。如下:
int main() {OutSideFunction(InsideFunctionC);OutSideFunction(InsideFunctionCPlusPlus);return 0; }到此就差不多了。昨天看了一遍,今天又寫博客溫習(xí)了一遍,應(yīng)該算是加深記憶了。
轉(zhuǎn)載于:https://www.cnblogs.com/lanqiu5ge/p/9472221.html
總結(jié)
以上是生活随笔為你收集整理的【转载】恼人的函数指针(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行尊尚白金分期信用卡怎么自动分期?
- 下一篇: R--线性回归诊断(一)