日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转载】恼人的函数指针(一)

發(fā)布時(shí)間:2023/12/13 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转载】恼人的函数指针(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文轉(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ù)制代碼

extern "C" int InsideFunctionC(const string& str1, const string& str2){return str1.compare(str2);}int InsideFunctionCPlusPlus(const string& str1, const string& str2){return str1.compare(str2); }

函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。