参数的传递方式有两种:传值和传地址。
传值
传值方式是将实参的值复制到形参中,因此实参和形参是两个不同的变量,各有各的存储空间,函数形参可以看做是函数的局部变量。如图:
传值的最大好处就是函数调用不会改变调用函数实参变量的内容,因为当实参的值传递给形参后,所进行的运算都是围绕形参进行的,没有实参的参与,所以,不会影响到实参的值,避免了一些不必要的副作用。
例如:
#include<iostream> using namespace std; void test(int); int main() { int a; a=1; test(a); cout<<"a="<<a<<endl; return 0; } void test(int i) { i++; cout<<"i="<<i<<endl; }
执行结果:
从结果可以看出,在调用过程中,当把实参a=1赋给了形参i后,i自加1,输出i=2;但是实际上并没有影响到实参a的值,调用完成之后,a的值还是1.
传地址
学过二代语言的人可能都接触过对寄存器的操作,在一些底层的语言中,对数据的读取操作中,有很大一部分是直接对地址中的数据来读写的,在高级语言中传递址的方式来传递参数虽然是通过指针引用这些实现的,但是原理感觉还是通过数据的地址对数据进行操作的,这种操作时对数据的直接操作。
例如:
#include<iostream> using namespace std; void test(int * i); int main() { int a; a=1; test(&a); cout<<"a="<<a<<endl; return 0; } void test(int * i) { (* i)++; cout<<"i="<<(* i)<<endl; }
执行结果:
其中,将形参i定义成指针类型,在使用时,指向a的内容,当调用test时,直接了改变a的值。