久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4788|回復: 0
打印 上一主題 下一主題
收起左側

函數指針與函數指針數組的使用方法

[復制鏈接]
跳轉到指定樓層
樓主
ID:77367 發表于 2015-4-19 02:18 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 bibi 于 2015-4-19 02:19 編輯

函數指針:

函數指針包含函數在內存中的地址。數組名實際上就是數組的第一個元素在內存中的地址,類似地,函數名實際上也是執行這個函數任務的代碼在內存中的起始地址。
函數指針可以傳遞給函數、從函數返回、保存在數組中、賦予另一個函數指針或者調用底層函數。
下面我們用數值算法accumulate討論下函數指針的用法。accumulate是一種常用的STL數學算法。
std::accumulate(v.begin(),v.end(),0);是對v中從v.begin()開始,直到v.end()(但不包括這個位置)范圍內的元素求和。
這個函數的第二個版本的第四個實參是一個通用函數,它確定了如何對元素求和。這個通用函數必須帶兩個實參并返回一個結果。第一個實參是和的當前值,第二個實參是序列中被求和的當前元素的值。
許多STL算法允許將函數指針傳遞到算法中,以幫助算法執行任務。
下面demo使用函數指針演示了accumulate函數。
  1. #include <iostream>  
  2. #include <vector>  
  3. #include <algorithm>         //copy算法  
  4. #include <numeric>          //accumulate算法  
  5. #include <functional>  
  6. #include <iterator>            //輸出迭代器  
  7. using namespace std;  
  8.   
  9. //定義sumSquares函數,它計算第二個實參value的平方,并將結果和第一個實參相加,返回二者之和。  
  10. int sumSquares(int total,int value)  
  11. {  
  12. return total + value*value;  
  13. }  
  14. int _tmain(int argc, _TCHAR* argv[])  
  15. {  
  16. const int SIZE = 10;  
  17. int array[SIZE] = {1,2,3,4,5,6,7,8,9,10};  
  18. vector<int> integers(array,array+SIZE);     //元素拷貝  
  19. ostream_iterator<int> output(cout," ");  
  20. int result;  
  21. cout<<"vector integers contains:\n";  
  22. copy(integers.begin(),integers.end(),output);  
  23.   
  24. //accumulate函數將它所迭代的序列的每個元素作為第二個實參傳遞給sumSquares函數  
  25. //第一次調用sumSquares函數時,第一個實參是total的初始值(作為accumulate的第三個實參提供,在這個例子中為0)  
  26. //在sumSquares函數的所有后續調用中,傳給它的第一個實參是前一次調用sumSquares時所返回的當前和。  
  27. //當accumulate結束時,它返回序列中所有元素的平方和。  
  28. result = accumulate(integers.begin(),integers.end(),0,sumSquares);//用一個指向sumSquares的函數指針作為最后一個實參調用accumulate函數  
  29.   
  30. cout<<"\n\nSum of square of element in integers using "  
  31.   <<"binary\nfuncion sunSquare: "<<result;  
  32.   
  33. cout<<endl;  
  34. system("pause");  
  35. return 0;  
  36. }  
復制代碼


運行結果:




函數指針與函數返回指針區別:
例如:
Void selectionSort(int work[],const int size,bool(*compare)(int,int))
在上面selectionSort的函數中出現了參數bool(*compare)(int,int)
這個參數指定一個函數指針。關鍵之bool表明被指向的函數返回一個bool值。
文本(*compare)表示這個函數指針的名稱(*表明參數compare是一個指針)。
文本“(int,int)”表示compare指向的函數接受兩個整形實參。
“*compare”兩邊的圓括號是必須的,它表示compare是一個函數指針。
如果沒有圓括號,則聲明變成bool *compare(int,int)
它聲明了一個函數,這個函數接收兩個整數作為參數,并返回一個指向bool值的指針。

函數指針數組
函數指針的一個用法出現在菜單驅動系統中。例如程序可以提示用戶輸入一個整數值來選擇菜單中的一個選項。用戶的選擇可以做函數指針數組的下標,而數組中的指針可以用來調用函數。
下面的demo提供了一個機械的例子,它演示了函數指針數組的聲明和使用。在程序中定義了3個函數:function0, function1和function2,每個函數都帶一個整形實參,并且不返回任何值。

  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. void function0(int);  
  5. void function1(int);  
  6. void function2(int);  
  7.   
  8. int _tmain(int argc, _TCHAR* argv[])  
  9. {  
  10. void (*f[3])(int) = {function0,function1,function2};  //將這3個函數指針保存在數組f中  
  11.   
  12. int choice;  
  13.   
  14. cout << "Enter a number between 0 and 2,3 to end: ";  
  15. cin >> choice;  
  16.   
  17. //處理用戶的選擇  
  18. while ((choice >= 0) && (choice <3))  
  19. {  
  20.   //調用數組f中的一個函數  
  21.   (*f[choice])(choice);   //f[choice]選擇在數組中位置為choice的指針。  
  22.                          //指針被解除引用,以調用函數,并且choice作為實參傳遞給這個函數。  
  23.   cout << "Enter a number between 0 and 2,3 to end: ";  
  24.   cin >> choice;  
  25. }  
  26.   
  27. cout << "Program execution completed." << endl;  
  28. system("pause");  
  29. return 0;  
  30. }  
  31.   
  32. void function0(int a)  
  33. {  
  34. cout << "You entered" << a << " so function0 was called\n\n";  
  35. }  
  36.   
  37. void function1(int b)  
  38. {  
  39. cout << "You entered" << b << " so function0 was called\n\n";  
  40. }  
  41.   
  42. void function2(int c)  
  43. {  
  44. cout << "You entered" << c << " so function0 was called\n\n";  
  45. }  
復制代碼



  運行結果:




分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久综合久色欧美综合狠狠 | 亚洲综合婷婷 | 久草在线高清 | 亚洲一区在线日韩在线深爱 | 久久久日韩精品一区二区三区 | 成人深夜福利网站 | 欧美一区精品 | 国产精品久久亚洲 | 性色av一区二区三区 | 香蕉大人久久国产成人av | 国产欧美在线播放 | 丁香综合 | 欧美精品啪啪 | 天天操网 | 亚洲精品成人 | 亚洲精品2区 | 久久成人免费 | 国产www在线 | 免费视频一区二区 | 久久久久一区 | 成人在线网址 | 亚洲成人99 | 99视频免费看 | 久久精品国产清自在天天线 | 日韩欧美国产精品一区二区 | 国产aa| 一区二区三区高清在线观看 | 久久久久久九九九九九九 | 国产精品免费一区二区三区四区 | 亚洲视频一区 | 黄色毛片免费视频 | 色播久久久 | 在线观看成人小视频 | 国产午夜在线 | 狠狠天天 | 国产精品久久久久久久久免费高清 | 欧美成年人视频在线观看 | 男人的天堂中文字幕 | 久草网站| 精品视频一区二区三区 | 亚洲444kkkk在线观看最新 |