首页 > 编程语言 > 详细

c++函数的参数传递的原理及其过程

时间:2015-06-04 11:49:09      阅读:215      评论:0      收藏:0      [点我收藏+]

我们只是知道函数调用的过程是先传递参数,然后是函数体,然后是返回值的顺序,但是这个过程怎么实现的,以及参数的入栈顺序等等,这里我大致的也是实验的态度做个验证,验证这句话也是为了加深自己对函数的调用,以及参数的传递的一个深刻的解释

1:验证的题目

           1、函数的调用过程的顺序(可能不这么个说法),验证函数是参数先传递个给函数主体,然后是函数体,最后是返回值

           2、参数的传递是从右到左压入栈的

           3、_fastcall调用协定函数参数的入栈顺序是冲左到右

2:开始验证

          为了验证上面的正确性,我写了一小段代码

#include<iostream>
using namespace std;
int  fun(int a,int b);
int main()
{
	int m,n;
	m=2,n=5;
	int fum;
	fum=fun(m,n);    //断点1
	cout<<fum;  //断点3
	return 0;        
}
int fun(int a,int b)
{
	int sum;
	sum=a+b;
	return sum;      //断点2
}


验证的思路:

              记录在断点1,断点2,断点3,四个位置的fun函数,m,n变量,参数a,参数b,sum,fum的地址以及他们的值,然后做个比较,发现其规律

阶段 名称 fun m n a b sum fum
断点1 内存地址 0x008E4410 0x003DFAA4 0x003DFA98 null null null 0x003DFA8C
值 55 8b ec 81 ec cc 02 00 00 00 05 00 00 00 null null null cc cc cc cc
断点2 内存地址 0x008E4410 NULL NULL 0x003DF9B4 0x003DF9B8 0x003DF9A4 NULL
值 55 8b ec 81 ec cc NULL NULL 02 00 00 00 05 00 00 00 07 00 00 00 NULL
断点3 内存地址 0x008E4410 0x003DFAA4 0x003DFA98 null null null 0x003DFA8C
值 55 8b ec 81 ec cc 02 00 00 00 05 00 00 00 null null null 07 00 00 00

     通过上面的数据,我们发现:

     1:在断点1的位置,函数的参数a和参数b是没有分配空间的,尽管函数已经声明,编译器为函数分配了空间0x008E4410

     2:断点2的位置,1、我们发现程序并不是先跳转到断点3,而是先进入函数,并且将函数的参数传递到函数内部

                                      2、a接收过来的是m的值,b接收过来是n的值,并且b的地址位0x003DF9B8高于a的地址位0x003DF9B4四个字节

                                      3、按照栈的入栈顺序是高位到低位入栈的顺序,发现b,先入栈,a后入栈

     3:断点3的位置,我们发现返回值已经传递给fum

     上述三点可以看出,函数的调用过程是参数,函数体,函数返回值的顺序依次进行,函数的参数的入栈方式是从右向左入栈的,而在函数前使用_fastcall约定,发现参数的顺序则是从左到右入栈了。测试方法和上面一模一样


     

                                      


          

c++函数的参数传递的原理及其过程

原文:http://blog.csdn.net/panker2008/article/details/46356073

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!