函数传参与汇编
在C语言中调用函数的时候,将实参数据传递给函数的方式,可以分为传值,传指针,以及C++中的传引用。这里所谓的传值,传指针和传引用都是针对实参来说的,也就是传实参的值,实参的指针,实参的引用。
4.3.1 传值
传值无法改变实参的值,因为传值的情况下,存放在栈上的形参只是实参值的一个拷贝,无法改变实参。
void func1(int x)
{
x=1;
}
int a=0;
func1(a);
010414AE add esp,4
4.3.2 传地址
下面是传指针的函数定义方式,形参x是一个指向整数类型数据的地址。在函数内部通过*运算符来引用实参。
void func2(int *x)
{
*x=2;
}
int a=0;
func2(&a);
010414B1 lea eax,[a] //把a的地址传入eax中,然后把eax入栈
010414B4 push eax
010414B5 call func2 (104100Ah)
010414BA add esp,4
4.3.3 传引用
下面是在C++中的传引用调用方式,注意,形参部分使用的是&,而在函数内部,可以直接把形参当做实参来使用,此时形参就是对实参的一个引用。传引用实际上也是传的实参的地址,是可以直接修改实参的。下面是在main函数里直接通过传引用的方式调用函数的方式:
void func3(int &x)
{
x=3;
}
int a=0;
func3(a);
010414BD lea eax,[a] //在汇编层与传指针的方法完全一样