[英]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.