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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

恼人的函数指针(一)

發布時間:2023/12/19 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 恼人的函数指针(一) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這篇是為了加深記憶所寫。發現,很多知識若不經過反復的琢磨和動手實踐,是很難記得住的。

1) ?函數指針的初始化。

函數如下:

1?int?CompareString(const?string&?str1,?const?string&?str2)
2?{
3?????return?str1.compare(str2);??

4?}

函數的初始化有兩種方式:

第一種,也是最普遍的方式:

1?int?(*CompareFunction)(const?string&,?const?string&)?=?CompareString;

第二種,是使用typedef定義函數類型,這種寫法有助于對代碼的理解:

1?typedef?int?(*CompareFunctionType)(const?string&,?const?string&);
2?CompareFunctionType?CompareFunction?=?CompareString;

2) ?函數指針賦值。

函數名可以理解為該類型函數的指針。當然,取地址操作符作用于函數名上也能產生指向該類型函數的指針。也就是說下面兩種賦值都是可行的:

1?CompareFunctionType?CompareFunction?=?CompareString;
2?CompareFunctionType?CompareFunction?=?&CompareString;

3) ?函數調用。

無論是用函數名調用,還是用函數指針調用,還是用顯式的指針符號調用,其寫法是一樣的:

1?CompareString("abc",?"cba");
2?CompareFunction("abc",?"cba");
3?(*CompareFunction)("abc",?"cba");

4) ?函數指針的數組。

對于函數指針的數組,強烈建議使用typedef方式定義類型之后再使用,不然影響代碼的閱讀性,繼續以以上例子為例:

1?//without?typedef
2?int?(*CompareFunctionArray[3])(const?string&,?const?string&);
3?//with?typedef
4?CompareFunctionType?CompareFunctionTypeArray[3];

5) ?函數指針用做函數返回值的類型。

到這一步,會發現typedef是多么的好用了。不然我是完全讀不懂下面語句的意思的:

1?//without?typedef
2?int?(*func(int*,?int))(const?string&,?const?string&);

上面的聲明,將func(int*, int)聲明為一個函數,返回值為函數指針,函數類型為int (*)(const string&, const string&)。

多么的晦澀啊!

如果寫成typedef就不用這么糾結了,足見typedef的作用:

1?CompareFunctionType?func(int*,?int);

6) ?指向extern "C"函數的指針。

《C++ primer 3》中有指出,指向C函數的指針和指向C++函數的指針類型不同,但是現在的很多編譯器都有語言擴展,認為這兩種函數的指針具有相同的特性。

所以,我在vs 2010中做了嘗試,結果證明是支持這種語言擴展的。

函數聲明如下:

1?extern?"C"?int?InsideFunctionC(const?string&?str1,?const?string&?str2)
2?{
3?????return?str1.compare(str2);
4?}
5?
6?int?InsideFunctionCPlusPlus(const?string&?str1,?const?string&?str2)
7?{
8?????return?str1.compare(str2);?

9?}

函數指針的初始化和調用,允許賦值為指向C函數的指針:

1?int?(*CompareFunction)(const?string&,?const?string&)?=?InsideFunctionC;

另外還有一點,當extern "C"應用在一個聲明上時,所有被它聲明的函數都將受到影響。舉個例子:

1?extern?"C"?void?OutSideFunction(int?(*fc)(const?string&,?const?string&))
2?{
3?????cout<<fc("abc",?"cba")<<endl;;
4?}

這里的OutSideFunction和fc都將受到extern "C"的影響,但是vs2010編譯器是支持一個指向C++函數的指針作為OutSideFunction的參數。如下:

1?int?main()
2?{
3?????OutSideFunction(InsideFunctionC);
4?????OutSideFunction(InsideFunctionCPlusPlus);
5?????
6?????return?0;?

7?}

到此就差不多了。昨天看了一遍,今天又寫博客溫習了一遍,應該算是加深記憶了。傻笑一個。

轉載于:https://www.cnblogs.com/AnnieKim/archive/2011/11/20/2255813.html

總結

以上是生活随笔為你收集整理的恼人的函数指针(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。