[英]Is my understanding of how variables work in recursive function correct?
最近,我在C ++類中進行了遞歸,我想知道變量的范圍對於特定的堆棧框架是本地的是否正確:
3)返回
2)flipString(“”); 開始= a,結束= t
1)flipString(at); 開始= s,結束= r
因此,當到達return語句時,它將彈出第三幀,
然后以s = t +“” + a關閉第二幀
然后第一幀s = r + at + s,從而反轉字符串。
void flipString(string &s)
{
if (s.size() < 2)
{
return;
}
else
{
string begin;
string end;
begin = s.at(0);
end = s.at(s.size()-1);
s.erase(s.begin());
s.erase(s.end()-1);
flipString(s);
s = end + s + begin;
}
return;
}
是的,您對功能如何工作以及功能本身的想法似乎是正確的。
在每次調用函數時,都有一個不同的局部變量開始和結束實例,這些實例放在堆棧上。
函數參數s引用或指向所有堆棧幀中的相同字符串,因為它是一個引用。
如果傳遞一個普通的函數參數(沒有引用而不是指針),則在每個調用堆棧級別也將有該參數的單獨副本。
在這種情況下,需要了解三種符號類型:
了解值的存儲位置以及堆棧的工作方式也很有用。
為每個函數調用創建一個堆棧框架。 這將創建函數執行的上下文以及對調用者上下文的引用。 當函數退出時,將刪除(彈出)函數的堆棧框架,並恢復調用者的上下文。
形式參數的位置保留在所調用函數的堆棧框架中。 同樣,局部變量存儲在函數的堆棧框架中。 實際參數或對它們的引用將復制到堆棧中,在此堆棧中它們的形式參數對應對象可以對其進行引用。
函數退出后,將釋放堆棧幀以及形式參數和局部變量空間。
請注意,對於作為參考值( &
)傳遞給實際值的參數,這些值的空間可能存在於當前堆棧框架之外(只有引用地址本身位於堆棧框架之內。忘了這可能會使人混淆為什么值會在函數調用之間保持不變 。這在使用指針時更為明顯,但在傳遞引用時可能會被忽略。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.