在調(diào)用時(shí),在需要函數(shù)做參數(shù)的位置直接寫上要做為實(shí)參的函數(shù)名就可以了:
創(chuàng)新互聯(lián)是一家朝氣蓬勃的網(wǎng)站建設(shè)公司。公司專注于為企業(yè)提供信息化建設(shè)解決方案。從事網(wǎng)站開發(fā),網(wǎng)站制作,網(wǎng)站設(shè)計(jì),網(wǎng)站模板,微信公眾號(hào)開發(fā),軟件開發(fā),小程序制作,十多年建站對(duì)成都垃圾桶等多個(gè)領(lǐng)域,擁有多年設(shè)計(jì)經(jīng)驗(yàn)。
如:
//---------------------------------------------------------------------------
#include stdio.h
int fun(void)
{
return 117;
}
int aun(int (*a)(void))
{
printf("%d\n",(*a)());
}
int main(void)
{
aun(fun);
return 0;
}
//---------------------------------------------------------------------------
Question:在函數(shù)void function()中,需要將另外一個(gè)函數(shù)double input()的函數(shù)名作為參數(shù)。
typedef double (*P)(int);
Note:參數(shù)部分需要注意,函數(shù)input()所有的輸入?yún)?shù)類型都需要包含在內(nèi)。
例如 double input(double u[5], int num, double x), 則在定義時(shí)寫作 typedef double (*P)(double*,int,double)。
此時(shí),函數(shù)作為一種類型,可以直接被其他函數(shù)調(diào)用。
函數(shù)聲明中定義 void function(P input),調(diào)用function(input)即可。
也可以寫成
我以前答過(guò)的一個(gè)題的例子拿給你看看。
函數(shù)名:errorSetHandler
參數(shù):function是個(gè)函數(shù)類型的變量,void (*)(int, char_t *),這個(gè)函數(shù)類型有兩個(gè)參數(shù),一個(gè)整型,一個(gè)char_t *的指針型,返回是個(gè)void *指針。
返回:是個(gè)函數(shù)類型,void (*)(int , char_t *),類型說(shuō)明跟上面一樣。
void (*errorSetHandler(void (*function)(int etype, char_t *msg)))(int etype, char_t *msg)
{
void (*oldHandler)(int etype, char_t *buf); //定義一個(gè)函數(shù)void (*)(int , char_t *)類型的函數(shù)變量oldHandler
oldHandler = errorHandler; //把errorHandler賦給oldHandler,errorHandler應(yīng)該也是個(gè)函數(shù)變量
errorHandler = function; //把參數(shù)function賦給errorHandler
return oldHandler; //返回函數(shù)變量oldHandler的值
}
補(bǔ)充一下:
通過(guò)typedef可以簡(jiǎn)化這個(gè)函數(shù)的形式:
typedef void (*ErrHdlr)(int, char_t *);
然后這個(gè)函數(shù)可以簡(jiǎn)化成:
ErrHdlr errorSetHandler(ErrHdlr function)
{
ErrHdlr oldHandler;
oldHandler = errorHandler;
errorHandler = function;
return oldHandler;
}
這樣是不是就很直觀了
就是把函數(shù)的返回值作為參數(shù)來(lái)調(diào)用外層函數(shù)。比如有返回兩個(gè)數(shù)的大者的函數(shù)int
max(int
a,int
b),那要求三個(gè)數(shù)的最大者就可以這么調(diào)用max(max(a,b),c);,就是先求得a、b中的大者再與c進(jìn)行比較……
#include?stdio.h
//---子函數(shù)聲明---//?
int?func1();
int?func2(int?(*func1)());????????//形參為函數(shù)指針(即指向函數(shù)的指針)?
//---主函數(shù)---//?
int?main(){
printf("向函數(shù)二傳遞函數(shù)一,\n即函數(shù)一作為函數(shù)二的參數(shù)。\n");
printf("%d?",func1());
printf("%d\n",func2(func1));//注意函數(shù)名即為函數(shù)地址?。。。。?!?
}????????????????????????????????//實(shí)參為函數(shù)名func1或者func1,兩者等價(jià),而非func1()?
//---子函數(shù)定義---//?
int?func1(){
return?1;
}
int?func2(int?(*func1)()){????????//形參為函數(shù)指針(即指向函數(shù)的指針)
return?func1()+1;
}