二、参数传递
1、形参与实参
在函数调用时,会为形参分配内存空间,并用实参的值为其赋值,也就是说形参与实参并不是同一段内存空间,值传递时,对形参的修改不会应用到实参。
#include<iostream> using namespace std; void print(int); int main(){ int n = 2; cout<<"地址: "<<&n<<endl; cout<<"数值:"<<n<<endl; print(n); return 0; } void print(int n){ cout<<"地址: "<<&n<<endl; cout<<"数值:"<<n<<endl; }
2、三种参数传递方式
1)值传递
对形参的修改不会影响到实参
#include<iostream> using namespace std; void change(int,int); int main(){ int x = 2,y = 3; cout<<"交换前:x="<<x<<",y="<<y<<endl; change(x,y); cout<<"交换后:x="<<x<<",y="<<y<<endl; return 0; } void change(int m,int n){ int temp; temp = n; n = m; m = temp; }输出结果为
交换前:x=2,y=3
交换后:x=2,y=3
2)指针传递
要想用被调函数改变调用函数中的变量值,应使函数中的操作直接作用在调用函数的变量上,要达到此目的,一个有效的途径是使用指针传递。此时操作的是指针所指向的地址的存储内容,这里的形参是指针,指向的内容与实参指向的内容相同,所以修改其指向的内容的值,实参也会被修改。
#include<iostream> using namespace std; void change(int *,int *); int main(){ int x = 2,y = 3; cout<<"交换前:x="<<x<<",y="<<y<<endl; change(&x,&y); cout<<"交换后:x="<<x<<",y="<<y<<endl; return 0; } void change(int *m,int *n){ int temp; temp = *n; *n = *m; *m = temp; }
输出结果为
交换前:x=2,y=3
交换后:x=3,y=2
3)引用传递
使用引用传递时,不会再为形参分配内存空间,所以此时形参就是实参自身,对形参的任何操作本质上就是对实参的操作。通过输出实参x和形参m的地址可以看出二者对应同一段内存。
#include<iostream> using namespace std; void change(int &,int &); int main(){ int x = 2,y = 3; cout<<"变量x的地址是:"<<&x<<endl; cout<<"交换前:x="<<x<<",y="<<y<<endl; change(x,y); cout<<"交换后:x="<<x<<",y="<<y<<endl; return 0; } void change(int &m,int &n){ int temp; temp = n; n = m; m = temp; cout<<"形参m的地址是:"<<&m<<endl; }
输出结果为
变量x的地址是:0012FF60
交换前:x=2,y=3
形参m的地址是:0012FF60
交换后:x=3,y=2
3、关于引用
引用就是别名,char的长度与char&的长度相同,对一个变量的操作与对该变量的引用的操作是等效的。
当返回类型为引用时,要求返回的变量不会因为函数的结束而消除,即返回的内容需要存在内存中。例如:
int& multiply(int m,int n){ int * a = new int; *a = m * n; return *a; }*a是堆中的内存,不会因为函数调用结束而被消除,但是不要忘记对a指向的内存的释放。