c++之函数参数传递
普通数值传递
过程:
- 首先计算出实参表达式的值
- 然后给形参变量分配一个存储空间,该空间大小等于形参类型的
- 将实参表达式的值存入形参变量分配的存储空间中,成为形参变量的初值
使用这种方式,形参得值得改变不会影响实参的值。这是因为在值传递的过程中,形参是作为被调函数的局部变量处理,在堆栈中开辟空间存放传递进来的实参值,形成了实参的一个副本。全程有形参的值,实参的值。
void fun(int a) {
a++;
cout << "形参的地址" << &a << endl;
a++;
cout << "形参的地址" << &a << endl;
}
int main()
{
int a = 3;
fun(a);
cout << "实参的地址" << &a << endl;
cout << "a="<<a << endl;
return 0;
}
指针传递
本质上是值传递,但是此时传递的是实参的存储地址,所以传递之后形参和实参都指向同一个对象,因此对形参指针指向的内容的任何改变都会影响到实参指向的内容,其他形参指针和实参指针指向的是同一块内存。但是形参指针的改变并没有影响实参指针本身的改变,影响的只是指针指向的内容。全程有实参的地址(2份,包括形参表示的同样的地址),实参的值。
void fun(int *a) {
(*a)++;
cout << "形参的地址" << a << endl;
a++;
cout << "形参的地址" << a << endl;
}
int main()
{
int a = 3;
fun(&a);
cout << "实参的地址" << &a << endl;
cout << "a="<<a << endl;
return 0;
}
引用传递
引用是和对象绑在一起的东西,是对象的别名,将引用作为参数,可以使得对形参的任何操作都作用于传递来的实参身上,因为他俩是同一个东西,只是名字不同罢了。在引用传递过程中,同样也是形参会作为局部变量在堆栈中开辟内存空间,但是这时存放的是实参变量的地址(区别于指针传递拷贝了指针的值),因为是引用,形参并没有单独的占用内存资源。这时对形参的任何造作都被处理成间接寻址,即通过堆栈中存方的地址访问主函数中的实参变量。全程只有实参的值和实参的地址。
void fun(int &a) {
a++;
cout << "形参的地址" << &a << endl;
a++;
cout << "形参的地址" << &a << endl;
}
int main()
{
int a = 3;
fun(a);
cout << "实参的地址" << &a << endl;
cout << "a="<<a << endl;
return 0;
}
总结区别:
- 普通数值传递不能通过形参的改变来改变实参的值
- 指针能根据形参中指针指向的内容的改变来改变实参的值,但是二者的指针本身的值还是不同的
- 引用不仅能够通过形参的改变来改变实参的值,而且只是实参占用了一份内存资源罢了,所以在C++中参数传递首选引用参数传递。