二、参数传递
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指向的内存的释放。