当前位置:   article > 正文

C++:函数调用的压栈过程_c++函数调用的压栈过程

c++函数调用的压栈过程
  1. #include <iostream>
  2. using namespace std;
  3. int f(int n)
  4. {
  5. cout << n << endl;
  6. return n;
  7. }
  8. void func(int param1, int param2)
  9. {
  10. int var1 = param1;
  11. int var2 = param2;
  12. printf("var1=%d,var2=%d", f(var1), f(var2));//如果将printf换为cout进行输出,输出结果则刚好相反
  13. }
  14. int main(int argc, char* argv[])
  15. {
  16. func(1, 2);
  17. return 0;
  18. }
  19. //输出结果
  20. //2
  21. //1
  22. //var1=1,var2=2
  1. 当函数从入口函数main函数开始执行时,编译器会将我们操作系统的运行状态,main函数的返回地址、main的参数、main函数中的变量、进行依次压栈;
  2. 当main函数开始调用func()函数时,编译器此时会将main函数的运行状态进行压栈,再将func()函数的返回地址、func()函数的参数从右到左、func()定义变量依次压栈;
  3. 当func()调用f()的时候,编译器此时会将func()函数的运行状态进行压栈,再将的返回地址、f()函数的参数从右到左、f()定义变量依次压栈;
  4. 从代码的输出结果可以看出,函数f(var1)、f(var2)依次入栈,而后先执行f(var2),再执行f(var1),最后打印整个字符串,将栈中的变量依次弹出,最后主函数返回。

函数的调用过程:

1)从栈空间分配存储空间

2)从实参的存储空间复制值到形参栈空间

3)进行运算

形参在函数未调用之前都是没有分配存储空间的,在函数调用结束之后,形参弹出栈空间,清除形参空间。

数组作为参数的函数调用方式是地址传递,形参和实参都指向相同的内存空间,调用完成后,形参指针被销毁,但是所指向的内存空间依然存在,不能也不会被销毁。

当函数有多个返回值的时候,不能用普通的 return 的方式实现,需要通过传回地址的形式进行,即地址/指针传递。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/569581
推荐阅读
相关标签
  

闽ICP备14008679号