繁体   English   中英

我对变量在递归函数中的工作方式的理解正确吗?

[英]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引用或指向所有堆栈帧中的相同字符串,因为它是一个引用。

如果传递一个普通的函数参数(没有引用而不是指针),则在每个调用堆栈级别也将有该参数的单独副本。

在这种情况下,需要了解三种符号类型:

  1. 局部变量-函数内声明的符号
  2. 形式参数-在函数实现中用作参数的符号
  3. 实际参数-调用者在函数调用时传递的表达式

了解值的存储位置以及堆栈的工作方式也很有用。

为每个函数调用创建一个堆栈框架。 这将创建函数执行的上下文以及对调用者上下文的引用。 当函数退出时,将删除(弹出)函数的堆栈框架,并恢复调用者的上下文。

形式参数的位置保留在所调用函数的堆栈框架中。 同样,局部变量存储在函数的堆栈框架中。 实际参数或对它们的引用将复制到堆栈中,在此堆栈中它们的形式参数对应对象可以对其进行引用。

函数退出后,将释放堆栈帧以及形式参数和局部变量空间。

请注意,对于作为参考值( & )传递给实际值的参数,这些值的空间可能存在于当前堆栈框架之外(只有引用地址本身位于堆栈框架之内。忘了这可能会使人混淆为什么值会在函数调用之间保持不变 。这在使用指针时更为明显,但在传递引用时可能会被忽略。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM