若是你已經明白了函數的參數機制,並且徹底理解並實踐了3.3節的內容,這一節實際上是很簡單的。只須要在函數的參數列表中,聲明一個函數指針類型的參數便可,而後再調用的時候傳給它一個實參就能夠了。你能夠這麼想象,就是把函數指針的賦值語句的等號換成了形參和實參結合的模式就行。
下面給一個簡單的例子:
ide
- /*
- *Author:Choas Lee
- *Date:2012-02-28
- */
- #include<stdio.h>
- float add(float a,float b){return a+b;}
- float minus(float a,float b){return a-b;}
- float multiply(float a,float b){return a*b;}
- float divide(float a,float b){return a/b;}
- int pass_func_pointer(float (*pFunction)(float a,float b))
- {
- float result=pFunction(10.0,12.0);
- printf("result=%f\n",result);
- }
- int main()
- {
- pass_func_pointer(add);
- pass_func_pointer(minus);
- pass_func_pointer(multiply);
- pass_func_pointer(divide);
- return 0;
- }
輸出結果爲:
- result=22.000000
- result=-2.000000
- result=120.000000
- result=0.833333
函數指針能夠做爲返回值。咱們先類比的思考一下,若是說整型能夠做爲返回值,你會怎麼聲明函數?嗯,應該是下面這個樣子的:
int func(){}
整數對應的類型爲int。一樣再類比如下,若是說整型指針能夠做爲返回值,你會怎麼聲明?嗯,這個貌似難度也不大:
int * func(){}
好吧,如今說函數指針若是能夠做爲返回值,你該怎麼聲明?首先要保證的一點就是返回的函數指針的類型必須是可以明顯的表達在這個函數的聲明或者定義形式中的,也就是說在這個形式中,要可以包含函數指針所對應的可以肯定函數類型的信息:這個函數類型的返回值類型,這個函數類型的參數個數,這個函數類型的參數類型。,
如今咱們在類比一次,若是要返回浮點型指針,那麼返回類型應該表達爲:
float *
若是要函數指針對應的函數是返回值爲浮點型,帶有兩個參數,兩個參數都是浮點型,那麼返回類型應該表達爲下面的表達形式:
float (*)(float ,float )
嗯,沒辦法,函數的語義比較複雜,對應的表現就是形式的複雜性了。對於返回爲浮點型指針的狀況,定義的函數的名稱放在「float *」的後面,而對於返回爲上面類型的函數指針的話,定義的函數就要放在「(*)」這個括號中的*的後面了。
因此對於如下形式:
float (* func(char op) ) (float ,float)
其具體含義就是,聲明瞭這樣一個函數:
l 其名稱爲func,其參數的個數爲1個;
l 其各個參數的類型爲:op—char;
l 其返回變量(函數指針)類型爲:float(*)(float,float)
再次強調:函數指針時變量哦。
到了這裏以後,咱們再來分析一下unix的系統調用函數signal的定義形式:
void (*signal)(int signo,void (*func)(int)))(int);
其具體含義爲就是,聲明瞭這樣一個函數:
l 其函數名稱爲:signal
l 其參數個數爲:2
l 其各個參數的類型爲:signo--int, func— void (*)(int)
l 其返回的變量(函數指針)的類型爲:void(*)(int)
上面這個函數比較經典,有一個參數類型爲函數指針,返回值仍是函數指針。
哦,個人天,若是你一步一步看到這裏了,就快大功告成啦。嘿嘿,接下來看一個例子:
- /*
- *Author:Choas Lee
- *Date:2012-02-28
- */
- #include<stdio.h>
- #include<stdlib.h>
- #include<string.h>
- float add(float a,float b){return a+b;}
- float minus(float a,float b){return a-b;}
- float multiply(float a,float b){return a*b;}
- float divide(float a,float b){return a/b;}
- float(* FunctionMap(char op) )(float,float)
- {
- switch(op)
- {
- case '+':
- return add;
- break;
- case '-':
- return minus;
- break;
- case '*':
- return multiply;
- break;
- case '\\':
- return divide;
- break;
- default:
- exit(1);
- }
- }
- int main()
- {
- float a=10,b=5;
- char ops[]={'+','-','*','\\'};
- int len=strlen(ops);
- int i=0;
- float (*returned_function_pointer)(float,float);
- for(i=0;i<len;i++)
- {
- returned_function_pointer=FunctionMap(ops[i]);
- printf("the result caculated by the operator %c is %f\n",ops[i],returned_function_pointer(a,b));
- }
- return 0;
- }
計算的結果爲:
- the result caculated by the operator + is 15.000000
- the result caculated by the operator - is 5.000000
- the result caculated by the operator * is 50.000000
- the result caculated by the operator \ is 2.000000