函數指針

顧名思義,指針函數即返回指針的函數。其一般定義形式如下:

??????類型名 *函數名(函數參數表列);

????其中,后綴運算符括號“()”表示這是一個函數,其前綴運算符星號“*”表示此函數為指針型函數,其函數值為指針,即它帶回來的值的類型為指針,當調用這個函數后,將得到一個“指向返回值為…的指針(地址),“類型名”表示函數返回的指針指向的類型”。

????“(函數參數表列)”中的括號為函數調用運算符,在調用語句中,即使函數不帶參數,其參數表的一對括號也不能省略。其示例如下:

????int *pfun(int, int);

????由于“*”的優先級低于“()”的優先級,因而pfun首先和后面的“()”結合,也就意味著,pfun是一個函數。即:

????int *(pfun(int, int));

????接著再和前面的“*”結合,說明這個函數的返回值是一個指針。由于前面還有一個int,也就是說,pfun是一個返回值為整型指針的函數。

????我們不妨來再看一看,指針函數與函數指針有什么區別?

??? int (*pfun)(int, int);

????通過括號強行將pfun首先與“*”結合,也就意味著,pfun是一個指針,接著與后面的“()”結合,說明該指針指向的是一個函數,然后再與前面的int結合,也就是說,該函數的返回值是int。由此可見,pfun是一個指向返回值為int的函數的指針。

????雖然它們只有一個括號的差別,但是表示的意義卻截然不同。函數指針的本身是一個指針,指針指向的是一個函數。指針函數的本身是一個函數,其函數的返回值是一個指針。

2.??? 用函數指針作為函數的返回值

??? 在上面提到的指針函數里面,有這樣一類函數,它們也返回指針型數據(地址),但是這個指針不是指向int、char之類的基本類型,而是指向函數。對于初學者,別說寫出這樣的函數聲明,就是看到這樣的寫法也是一頭霧水。比如,下面的語句:

????int (*ff(int))(int *, int);

我們用上面介紹的方法分析一下,ff首先與后面的“()”結合,即:

????int (*(ff(int)))(int *, int);????????????????????????????// 用括號將ff(int)再括起來

也就意味著,ff是一個函數。

????接著與前面的“*”結合,說明ff函數的返回值是一個指針。然后再與后面的“()”結合,也就是說,該指針指向的是一個函數。

這種寫法確實讓人非常難懂,以至于一些初學者產生誤解,認為寫出別人看不懂的代碼才能顯示自己水平高。而事實上恰好相反,能否寫出通俗易懂的代碼是衡量程序員是否優秀的標準。一般來說,用typedef關鍵字會使該聲明更簡單易懂。在前面我們已經見過:

????int (*PF)(int *, int);

也就是說,PF是一個函數指針“變量”。當使用typedef聲明后,則PF就成為了一個函數指針“類型”,即:

????typedef int (*PF)(int *, int);

這樣就定義了返回值的類型。然后,再用PF作為返回值來聲明函數:

??? PF ff(int);

???下面將以程序清單1為例,說明用函數指針作為函數的返回值的用法。當程序接收用戶輸入時,如果用戶輸入d,則求數組的最大值,如果輸入x,則求數組的最小值,如果輸入p,則求數組的平均值。

程序清單 1? 求最值與平均值示例

1?????? #include<stdio.h>

2?????? #include <assert.h>

3?????? double GetMin(double *dbData, int iSize)?????????????? // 求最小值

4?????? {

5???????????double dbMin;

6???????????int i;

7??????

8???????????assert(iSize>0);

9???????????dbMin=dbData[0];

10??????????for (i=1; i<iSize; i++){

11??????????????? if (dbMin>dbData[i]) {

12???????????????????? dbMin=dbData[i];

13??????????????? }

14??????????}

15??????????return dbMin;

16???? }

17

18???? double GetMax(double *dbData, int iSize)???????????????? // 求最大值

19???? {

20?????????double dbMax;

21?????????int i;

22

23?????????assert(iSize>0);

24?????????dbMax=dbData[0];

25?????????for (i=1; i<iSize; i++){

26???????????? if (dbMax< dbData[i]) {

27???????????????? dbMax=dbData[i];

28???????????? }

29?????????}

30?????????return dbMax;

31???? }

32

33???? double GetAverage(double *dbData, int iSize)????????????// 求平均值

34???? {

35?????????double dbSum=0;

36?????????int i;

37????

38?????????assert(iSize>0);

39?????????for (i=0; i<iSize; i++)

40?????????{

41????????????? dbSum+=dbData[i];

42?????????}

43?????????return dbSum/iSize;

44???? }

45

46???? double UnKnown(double *dbData, int iSize)?????????????// 未知算法

47???? {

48?????????return 0;

49???? }

50

51???? typedef double (*PF)(double *dbData, int iSize);???? // 定義函數指針類型

52???? PF GetOperation(char c)????????????????????????????? // 根據字符得到操作類型,返回函數指針

53???? {

54?????????switch (c)

55?????????{

56????????? ?case 'd':

57?????????? ????????? return GetMax;

58???????????case 'x':

59???????????????????? return GetMin;

60???????????case 'p':

61???????????????????? return GetAverage;

62???????????default:

63???????????????????? return UnKnown;

64???????????}

65???? }

66

67???? int main(void)

68???? {

69??????????double dbData[]={3.1415926, 1.4142, -0.5,999, -313, 365};

70??????????int iSize=sizeof(dbData)/sizeof(dbData[0]);

71??????????char c;

72

73??????????printf("Please input the Operation :\n");

74??????????c=getchar();

75??????????printf("result is %lf\n", GetOperation(c)(dbData,iSize));?? // 通過函數指針調用函數

76????}

????上述程序中前面4個函數分別實現求最大值、最小值、平均值和未知算法,然后實現了GetOperation函數。這個函數根據字符的返回值實現上面4個函數。它是以函數指針的形式返回的,從后面的main函數的GetOperation(c)(dbData, iSize)可以看出,通過這個指針可以調用函數。

轉載于:https://www.cnblogs.com/nktblog/archive/2013/02/20/2918084.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274359.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274359.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274359.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

orton效果_如何使圖片發光:Orton效果

orton效果Have you ever seen an impossibly dream-like landscape photo? One with a slow burning, glowing sunset. That’s really the best way to describe it, the image looks as if it’s glowing. You might be thinking, “wow, I wish I was that good and could …

UVA10785 The Mad Numerologist

雖然是sorting的壓軸&#xff0c;但是比起前面真心水題。這個專題結合前面string的很多&#xff0c;排序相對簡單了&#xff0c;qsort基本解決。 題目&#xff1a; The Mad Numerologist Numerology is a science that is used by many people to find out a mans personality,…

蘋果人機交互指南_蘋果人機界面設計指南的10個見解

蘋果人機交互指南重點 (Top highlight)I’ve been developing an IOS app for the past few months and have been constantly referring to Apple’s Human Interface Design Guidelines. I would consider it a must-read for any aspiring or current UI/UX designer.在過去…

也來學學插件式開發

上一家公司有用到插件式開發來做一個工具箱&#xff0c;類似于QQ電腦管家&#xff0c;有很多工具列表&#xff0c;點一下工具下載后就可以開始使用了。可惜在那家公司待的時候有點短&#xff0c;沒有好好研究一下。現在有空&#xff0c;自己在網上找了些資料&#xff0c;也來試…

同態加法_我對同態的想法

同態加法Early February, I uploaded this shot onto Dribbble. Nothing fancy –– just two screens experimenting with “2月初&#xff0c;我將這張照片上傳到Dribbble。 沒什么幻想–只有兩個屏幕在嘗試“ Neumorphism,” or soft UI. Little did I know that this post…

php內核探索

引自&#xff1a;http://www.nowamagic.net/librarys/veda/detail/1285 SAPI:Server Application Programming Interface 服務器端應用編程端口。研究過PHP架構的同學應該知道這個東東的重要性&#xff0c;它提供了一個接口&#xff0c;使得PHP可以和其他應用進行交互數據。 本…

hp-ux鎖定用戶密碼_UX設計101:用戶研究-入門需要了解的一切

hp-ux鎖定用戶密碼這是什么&#xff1f; (What is this?) This session is part of a learning curriculum that I designed to incrementally skill up and empower a team of Designers and Researchers whose skillset and ways of working needed to evolve to keep up wi…

等比數列前N項和的公式推導

設等比數列的前n項和為S(n), 等比數列的第一項為a1&#xff0c;比值為q。 &#xff08;1&#xff09;S(n) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1);&#xff08;2&#xff09;S(n1) a1 a1 * q a1 * q ^ 2 .... a1 * q ^ (n - 1) a1 * q ^ n;由&#xff08;2&am…

extjs6 引入ux_關于UX以及如何擺脫UX的6種常見誤解

extjs6 引入uxDo you ever browse social media, internet, or talk to colleagues and hear them say something UX related you disagree with so much that you just want to lecture them on the spot?您是否曾經瀏覽過社交媒體&#xff0c;互聯網或與同事交談&#xff0c…

Cocos2D-HTML5開源2D游戲引擎

http://www.programmer.com.cn/12198/ Cocos2D-HTML5是基于HTML5規范集的Cocos2D引擎的分支&#xff0c;于2012年5月發布。Cocos2D-HTML5的作者林順將在本文中介紹Cocos2D-HTML5的框架、API、跨平臺能力以及強大的性能。Cocos2D-HTML5是Cocos2D系列引擎隨著互聯網技術演進而產生…

illustrator下載_Illustrator筆工具練習

illustrator下載Adobe Illustrator is a fantastic vector creation tool and you can create a lot of things without ever using the Pen Tool. However, if you want to use Illustrator at its full potential, I personally believe that you need to master and become …

怎么更好練習數位板_如何設計更好的儀表板

怎么更好練習數位板重點 (Top highlight)Dashboard noun \?dash-?b?rd\ A screen on the front of a usually horse-drawn vehicle to intercept water, mud, or snow.儀表盤 名詞\ ?dash-?b?rd \\通常在馬拉的車輛前部的屏幕&#xff0c;用來攔截水&#xff0c;泥或雪。…

學習正則表達式

deerchao的blog Be and aware of who you are. 正則表達式30分鐘入門教程 來園子之前寫的一篇正則表達式教程&#xff0c;部分翻譯自codeproject的The 30 Minute Regex Tutorial。 由于評論里有過長的URL,所以本頁排版比較混亂,推薦你到原處查看,看完了如果有問題,再到這里來提…

人物肖像速寫_去哪兒? 優步肖像之旅

人物肖像速寫In early 2018, the Uber brand team started a rebranding exercise, exploring a fresh take on what it means to be a global transportation and technology company. A new logo was developed in tandem with a bespoke sans-serif typeface called Uber Mo…

js獲取和設置屬性

function square(num){ var total num*num;//局部變量 return total;}var total 50;//全局變量var number square(20);alert(total);//結果為50function square(num){ total num*num;//全局變量 return total;}var total 50;//全局變量var number square(20)…

hp-ux鎖定用戶密碼_我們如何簡化925移動應用程序的用戶入門— UX案例研究

hp-ux鎖定用戶密碼Prologue: While this is fundamentally a showcase of our process in the hopes of helping others, it’s also a story about the realism of limitations when working with clients and how we ultimately were able to deliver a product the client w…

微信公眾號無需二次登錄_您無需兩次解決問題-您需要一個設計系統

微信公眾號無需二次登錄重點 (Top highlight)The design system concept can be differently defined according to each person’s background. Designers may say that a design system is a style guide while developers may say it is UI standards, or specs, or even as…

android中AsyncTask和Handler對比

1 &#xff09; AsyncTask實現的原理,和適用的優缺點 AsyncTask,是android提供的輕量級的異步類,可以直接繼承AsyncTask,在類中實現異步操作,并提供接口反饋當前異步執行的程度(可以通過接口實現UI進度更新),最后反饋執行的結果給UI主線程. 使用的優點: l 簡單,快捷 l 過程可…

視覺工程師面試指南_選擇正確視覺效果的終極指南

視覺工程師面試指南When it comes to effective data visualization, the very first and also the most critical step is to select the right graph/visual for the data that you want to present. With a wide range of visualization software that is available offerin…

在 Linux 下使用 水星MW150cus (RTL8188CUS芯片)無線網卡

Fedora &#xff08;如果你不使用 PAE 內核&#xff0c;請去掉 PAE 字樣&#xff09;:yum install gcc kernel-PAE kernel-PAE-devel kernel-headers dkms Ubuntu: apt-get install make gcc linux-kernel-devel linux-headers-uname -r安裝原生驅動 注意&#xff1a;由于在 Li…