long
成都創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),永和企業(yè)網(wǎng)站建設(shè),永和品牌網(wǎng)站建設(shè),網(wǎng)站定制,永和網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,永和網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
int
(*p)();
long
int
f(int
n)
{if
(n3)
return
(*p)(n-1)+(*p)(n-3);
else
return
n;
}
main()
{
long
int
r;
int
a;
p=f;
scanf("%d",a);
r=(*p)(a);
printf("%ld",r);
}
另外和你說一下,你用不用函數(shù)指針寫程序,與你的程序的運(yùn)行速度是沒關(guān)系的,遞歸主要是會(huì)消耗大量的??臻g.就是改成函數(shù)指針,也不會(huì)快些
你上面的那個(gè)函數(shù)要求的返回值是long
int長整型的,但是你在n3時(shí)return的根本就不是這種類型的return
(*p)(n-1)+(*p)(n-3)這樣的用法是絕對錯(cuò)誤的,你沒定義p是什么樣的指針,而且將n+1和n-3強(qiáng)制轉(zhuǎn)換為指針類型,再做加法,這是完全不對的(你可以去看看指針方面的知識)至于寫成遞歸很簡單?。?/p>
long
int
f(int
n)
{
if(n3)
return
f(n+1)+f(n-3)
;
else
return
n;
}
比如:void
g(char);
fp
=
fp();
//運(yùn)行f函數(shù),得到函數(shù)指針
fp
=
fp();
//運(yùn)行f函數(shù),得到函數(shù)指針
//...and
so
on我們現(xiàn)在是在C++里,不是在C或是匯編里,在那些語言里沒有類型檢查,只要是存儲(chǔ)空間一樣大,什么都可以相互等同。在C++里,我們享受了類型安全的優(yōu)點(diǎn),現(xiàn)在該修補(bǔ)它帶來的一些“缺陷”來當(dāng)作回報(bào)了。也許有人很快會(huì)在腦海里閃過一些代碼,類似于:typedef
FuncPtr
(*
FuncPtr)();
//對應(yīng)的函數(shù)指針的定義FuncPtr
f()
//一個(gè)函數(shù)的定義{//do
something...
return
f;
//返回函數(shù)的指針
}編譯器會(huì)產(chǎn)生這樣的等同代碼:void
function(TypeA
_tmp_){TypeA
a;_tmp_
=
a;
//these
are
for
"return
a;"return;}注意到函數(shù)的返回類型(_tmp_的類型)和a的類型是一樣的,都是TypeA。那么能不能使_tmp_和a的類型不同呢?當(dāng)然可以了!只要a能轉(zhuǎn)化成_tmp_,或說_tmp_能從a構(gòu)建出來,比如:class
TypeA{};
class
TypeB{TypeB(){}TypeB(const
TypeA
){}
//construct
B
from
A
};從一個(gè)typeA類型的對象可以構(gòu)建一個(gè)TypeB類型的對象,那么我們可以這樣修改上面的函數(shù):TypeB
function(){TypeA
a;return
a;
//construct
B-object
from
a
}我們討論到這里,也許有人會(huì)想到我下一步要做什么了!對了,由于在函數(shù)申明中,函數(shù)返回的值類型不能是函數(shù)本身的指針類型——不能簡單的遞規(guī)typedef,這在前面的例子里大家都看到了——那么我們需要一個(gè)類型轉(zhuǎn)化:從函數(shù)本身的指針類型轉(zhuǎn)化成另一個(gè)類型,再在賦值的時(shí)候轉(zhuǎn)化回來,就可以了。于是我們定義的了一個(gè)類:class
_FuncPtrClass{//something
magic
here...
return
f;}typedef
_FuncPtrClass
(*
FuncPtr)();
//函數(shù)指針類型FuncPtr定義我們來看看_FuncPtrClass類應(yīng)該具有哪些特點(diǎn)。首先,它要能從FuncPtr對象構(gòu)建出來,并且要負(fù)責(zé)傳遞這個(gè)指針的值,所以它需要一個(gè)FuncPtr類型的成員變量,和一個(gè)定制的構(gòu)造函數(shù)。注意,F(xiàn)uncPtr的定義是在_FuncPtrClass之后的,所以實(shí)際上在_FuncPtrClass內(nèi)應(yīng)該重新定義FuncPtr:class
_FuncPtrClass{public:typedef
_FuncPtrClass
(*
FuncPtrInClass)();
//重新定義FuncPtr為FuncPtrInClass
_FuncPtrClass(FuncPtrInClass
f):f_(f){}
//定制的構(gòu)造函數(shù)private:FuncPtrInClass
f_;
//FuncPtrInClass類型的成員變量
public:typedef
_FuncPtrClass
(*
FuncPtrInClass)();
_FuncPtrClass(FuncPtrInClass
f):f_(f){}
operator
FuncPtrInClass(){return
f_;}
//從_FuncPtrClass到FuncPtrInClass轉(zhuǎn)換的函數(shù)private:FuncPtrInClass
f_;
return
f;}typedef
_FuncPtrClass
(*
FuncPtr)();我們就能放心的運(yùn)行以前的代碼了:FuncPtr
fp
=
f();
//運(yùn)行f函數(shù),得到函數(shù)指針
fp
=
fp();
//運(yùn)行f函數(shù),得到函數(shù)指針
fp
=
fp();
//運(yùn)行f函數(shù),得到函數(shù)指針
//...and
so
on好了,大功告成!
也許有人會(huì)認(rèn)為我這里講的例子一點(diǎn)實(shí)際用處也沒有,的確,我也這樣認(rèn)為。不過我并不認(rèn)為這個(gè)技巧是沒用的。任何人說某個(gè)東西一點(diǎn)用處也沒有,都有點(diǎn)武斷的嫌疑。
return; 返回調(diào)用點(diǎn);
非遞歸,返回調(diào)用他的那個(gè)函數(shù),調(diào)用他的那個(gè)地方;
遞歸調(diào)用,返回自己調(diào)用自己的地方,或者第一次調(diào)用他的地方,這個(gè)只有分析代碼才知道具體情況。
無返回值函數(shù),相當(dāng)于,BASIC 的子程序,pascal 的過程,返回調(diào)用語句處,以便執(zhí)行下一條語句,實(shí)際返回點(diǎn)是下一條指令,然后可能還要,再執(zhí)行些,調(diào)用后的掃尾的工作,才來到下一步執(zhí)行。
有返回值函數(shù),返回使用函數(shù)值的地方。
不管哪一種,都是返回調(diào)用處,繼續(xù)向下執(zhí)行。
函數(shù)調(diào)用,首先要執(zhí)行計(jì)算參數(shù)的任務(wù),然后執(zhí)行參數(shù)傳遞的工作,然后才輪到調(diào)用函數(shù)。
函數(shù)調(diào)用前,可能還要保存現(xiàn)場,具體就是寄存器壓棧保存,防止函數(shù)調(diào)用時(shí),現(xiàn)場被破壞
調(diào)用完成,要恢復(fù)現(xiàn)場,恢復(fù)寄存器的值,具體就是從堆棧中,彈出保存的寄存器數(shù)據(jù)值。
遞歸函數(shù),一般包含:
1)退出條件,適當(dāng)條件下函數(shù)退出遞歸。
2)遞歸部分(自調(diào)用,并適當(dāng)更新,執(zhí)行條件,函數(shù)參數(shù),全局變量等)
3)執(zhí)行部分,如打印節(jié)點(diǎn)信息等。
看遞歸代碼,
1)首先,看何時(shí)退出遞歸(程序不再執(zhí)行自調(diào)用)
2)看遞歸執(zhí)行順序
3)看執(zhí)行代碼,干了什么。和遞歸部分的執(zhí)行的先后順序。
4)有些遞歸函數(shù),沒有獨(dú)立的執(zhí)行部分,只有一些表達(dá)式,看他先后執(zhí)行那些表達(dá)式。
5)有些遞歸函數(shù),只看函數(shù)本身看不出是遞歸函數(shù),因?yàn)檫@個(gè)函數(shù),會(huì)調(diào)用別的函數(shù),別的函數(shù)又會(huì)再回頭調(diào)用該函數(shù)本身。
這就要查看,函數(shù)調(diào)用鏈,里面是否調(diào)用了自己。
PS:
不管是否遞歸,函數(shù)總是要干點(diǎn)什么的(函數(shù)的功能)。
所以,看遞歸函數(shù),不能光看函數(shù),自己調(diào)用自己的,遞歸部分;
還要看,非遞歸部分干了什么,這個(gè)部分,才是遞歸實(shí)際干的事情;
遞歸不過是一種重復(fù)而已,通過遞歸部分反復(fù)調(diào)用自己;
從而重復(fù)執(zhí)行非遞歸部分,完成遞歸函數(shù)的功能。
C,C++ :return 語句有兩個(gè)功能
1)返回調(diào)用處,程序執(zhí)行下一步。
2)返回執(zhí)行的結(jié)果
1)這個(gè)功能,返回的函數(shù)調(diào)用的位置,執(zhí)行下步的程序。
在表達(dá)式中,函數(shù)調(diào)用會(huì)得到一個(gè)結(jié)果,程序解析表達(dá)式的時(shí)候遇到函數(shù),會(huì)調(diào)用函數(shù)
代碼執(zhí)行,會(huì)因此跳到函數(shù)內(nèi)部,開始執(zhí)行函數(shù)內(nèi)部的程序,執(zhí)行完畢;
會(huì)得到一個(gè)結(jié)果,這個(gè)結(jié)果就是函數(shù)的返回值,也叫函數(shù)值,
這時(shí)函數(shù)調(diào)用就結(jié)束了,程序返回繼續(xù)解析表達(dá)式,并用函數(shù)返回值代替函數(shù),繼續(xù)解析(計(jì) 算)表達(dá)式。
1) 如果表達(dá)式比較復(fù)雜的話;如果表達(dá)式解析沒有完成,函數(shù)返回解析表達(dá)式的斷點(diǎn)處,
如果完成了,執(zhí)行下一條語句,
2)如果表達(dá)式比較簡單,函數(shù)返回后,會(huì)執(zhí)行下一條語句。
單獨(dú)的一條函數(shù)調(diào)用,稱為函數(shù)調(diào)用表達(dá)式。
所以,C 幾乎一切都是表達(dá)式。
任何表達(dá)式,加上分號,就是一條語句。
所以 單獨(dú)的函數(shù)調(diào)用加上分號,構(gòu)成一條單獨(dú)的函數(shù)調(diào)用表達(dá)式語句,就是函數(shù)調(diào)用語句。
函數(shù)調(diào)用語句,執(zhí)行完成后返回調(diào)用點(diǎn),執(zhí)行邏輯上的下一條語句。
總結(jié):
函數(shù)返回
1)返回值:函數(shù)返回值,放在特定的寄存器中(
X86,WINDOWS WIN32 VC eax---char,int 指針; edx:eax---long long,__int64;協(xié)處理器的浮點(diǎn)堆棧寄存器 float,double,long double :ST(0) ),如果返回值的類型,比較長,會(huì)使用一個(gè)全局變量(static???)存放返回值,并把該全局變量的指針,放在特定的寄存器中(X86,WINDOWS WIN32 VC:
eax)。
2)返回位置:函數(shù)結(jié)束,程序返回調(diào)用點(diǎn)。繼續(xù)執(zhí)行。
注意:由于函數(shù)可以用在表達(dá)式中,所以函數(shù)實(shí)際返回,解析表達(dá)式的斷點(diǎn)處,繼續(xù)解析表達(dá)式。
函數(shù)調(diào)用本身,就是一個(gè)表達(dá)式,稱為函數(shù)調(diào)用表達(dá)式。
我現(xiàn)在看不懂你的程序用途。 最明顯的錯(cuò)誤就是函數(shù) int page(int *prt) 這應(yīng)該返回int的值。 而在你這個(gè)函數(shù)體中沒有return語句。 int page_2(int *);這句是否為一個(gè)函數(shù)的聲明?但之后沒有看到函數(shù)的定義部分。 也沒有調(diào)用的地方。是否可以刪除?函數(shù)是不在另一函數(shù)體內(nèi)部定義的。
你的說法是有問題的。
通常說,通過指針作為函數(shù)的參數(shù),可以再被調(diào)函數(shù)中,修改實(shí)際參數(shù)所指向的變量的值,也就是把改變傳遞給主調(diào)函數(shù)。
但是,請看清楚上面的說法,“通過指針作為函數(shù)的參數(shù),可以再被調(diào)函數(shù)中,修改實(shí)際參數(shù)所指向的變量的值”。是修改實(shí)際參數(shù)所指向的變量的值,而不是修改實(shí)際參數(shù)本身。
你的代碼里面是要修改實(shí)際參數(shù)本身,而不是修改實(shí)際參數(shù)所指向變量。
要完成這個(gè)功能,你就需要指向指針的指針了
網(wǎng)站名稱:c語言遞歸指針函數(shù),c語言遞歸函數(shù)怎么理解
網(wǎng)站地址:http://aaarwkj.com/article42/dsiihec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供搜索引擎優(yōu)化、ChatGPT、、網(wǎng)頁設(shè)計(jì)公司、做網(wǎng)站、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)