C++函数中值的传递方式与实现原理分析
值传递、引用传递、指针传递
#include<iostream>
using namespace std;
//值传递
void change1(int n){
cout<<"值传递--函数中n的地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址
n++;
}
//引用传递
void change2(int & n){
cout<<"引用传递--函数中n的地址"<<&n<<endl;
n++;
}
//指针传递
void change3(int *n){
cout<<"指针传递--函数中n的地址 "<<n<<endl;
*n=*n+1;
}
int main(){
int n=10;
cout<<"实参的地址"<<&n<<endl;
change1(n);
cout<<"change1() n="<<n<<endl;
change2(n);
cout<<"change2() n="<<n<<endl;
change3(&n);
cout<<"change3() n="<<n<<endl;
return true;
}
执行结果
分析
1、值传递
change1(int n) 在传入实参后在函数体内新定义了个int型局部变量n 并且将它赋值为传入的实参。也就是拷贝。
2、引用传递
首先我们先了
引用传递可以理解为直接传入的这个值 即在函数体内部未新定义变量去接收这个值 ,未开辟新的空间。 它只是创造了一个新的别名而已,要是在函数中有改变就会对原来的对象产生改变。
3、指针传递
指针传递其实和值传递一样,只不过在函数体内定义的是一个指针型变量 并将它赋值为传入的地址 通过指针去访问与修改数据
引用传递与指针传递的区别
由于引用传递与指针传递的处理方式不同。因此,在引用传递的方式下,由于是直接引用的实参的地址,所以如果在被调函数中对该指针(即地址)进行修改,那么新的地址就不再是原来的地址,因此原来实参的信息就会发生丢失。
而指针传递是在被调函数中开辟了新区域并复制了一份实参的地址,因此修改该指针(地址),并不会对实参的地址造成破坏。但由于引用传递未开辟新的内存区域,因此其运行效率会高,并且省空间。