函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。
成都創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)公司、網(wǎng)站制作、網(wǎng)站營銷推廣、網(wǎng)站開發(fā)設(shè)計,對服務(wù)成都圍欄護(hù)欄等多個行業(yè)擁有豐富的網(wǎng)站建設(shè)及推廣經(jīng)驗(yàn)。成都創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司成立于2013年,提供專業(yè)網(wǎng)站制作報價服務(wù),我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞心悅目的作品。 與客戶共同發(fā)展進(jìn)步,是我們永遠(yuǎn)的責(zé)任!
函數(shù)指針有兩個用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
函數(shù)指針的聲明方法為:
返回值類型 ( *?指針變量名) ([形參列表]);
如:
int func(int x); /* 聲明一個函數(shù) */
int (*f) (int x); /* 聲明一個函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
或者使用下面的方法將函數(shù)地址賦給函數(shù)指針:
f = func;
賦值時函數(shù)func不帶括號,也不帶參數(shù),由于func代表函數(shù)的首地址,因此經(jīng)過賦值以后,指針f就指向函數(shù)func(x)的代碼的首地址。
下面的程序說明了函數(shù)指針調(diào)用函數(shù)的方法:
#includestdio.h
int?max(int?x,int?y){return?(xy??x:y);}
int?main()
{
int?(*ptr)(int,?int);
int?a,?b,?c;
ptr?=?max;
scanf("%d%d",?a,?b);
c?=?(*ptr)(a,b);
printf("a=%d,?b=%d,?max=%d",?a,?b,?c);
return?0;
}
當(dāng)左邊是個對象時用“.”
當(dāng)左邊是個指向?qū)ο蟮闹羔槙r用“-”
比如,Class A;
Class *B=A;
A有函數(shù)myfun()
則調(diào)用時用
A.myfun();
B-myfun();
main()
{int x,n;
scanf("%d%d",x,n);
pn(x,n);
printf("%d",pn); //你這里寫的不正確,你把pn當(dāng)作返回值了,其實(shí)它是個函數(shù)指針,printf的第二個參數(shù)可以是指針也可是值,所以編譯可以通過,若顯示也顯示的是pn這個函數(shù)的地址值
}
/////////////////可以這樣寫,用個變量p做傳遞
main()
{int x,n;
int p;
scanf("%d%d",x,n);
p=pn(x,n);
printf("%d",p); //用p做傳遞
}
--------------------------------------
是這樣的,我又仔細(xì)看了
#includemath.h
pn(int x,int n)
{int p;
if(n==0) p=1;
if(n==1) p=x;
if(n=1) p=((2*n-1)*x-pn(x,n-1)-(n-1)*pn(x,n-2))/n;
return p;
} //這個會比較三次,尤其是n=1時,p=x,又進(jìn)行了p=1的調(diào)用,結(jié)果就錯啦,試著把n=1的''去掉
pn(int x,int n)
{int p;
if(n==0) return(1);
if(n==1) return(x);
if(n=1) return(((2*n-1)*x-pn(x,n-1)-(n-1)*pn(x,n-2))/n);
} //這個比較的次數(shù)和值n有關(guān)
另外,虛機(jī)團(tuán)上產(chǎn)品團(tuán)購,超級便宜
#includestdio.h
//定義類型fun_ptr,它是一個函數(shù)指針,指向的函數(shù)返回值為int,參數(shù)為int
typedef?int?(*fun_ptr)(int);
//fun1
int?fun1(int?a)
{
printf("call?fun1,pram=%d,return?%d+1\n",?a,?a);
return?a+1;
}
//fun2
int?fun2(int?a)
{
printf("call?fun2,pram=%d,return?%d+2\n",?a,?a);
return?a+2;
}
int?main(int?argc,?char?*argv[])
{
int?a?=?10;
int?s?=?0;
//定義函數(shù)指針類型的變量p_fun
fun_ptr?p_fun;
//指向fun1
p_fun?=?fun1;
//執(zhí)行
s=p_fun(a);
printf("s=%d\n",?s);
//指向fun2
p_fun?=?fun2;
//執(zhí)行
s=p_fun(a);
printf("s=%d\n",?s);
return?0;
}
執(zhí)行結(jié)果: