C++ 值传递和地址传递和引用传递
在我们在函数间数据传递的时候会出现,在函数中数据处理的间而过理想的,但在主函数中数据并没有发生变化。具体详情如下:
在数据传递时,分为值传递和地址传递;
值传递:在函数调用时实参将数据传入形参
#include<iostream>
#include<string>
using namespace std;
void swap(int x, int y)
{
int temp=0;
temp = x;
x = y;
y = temp;
cout << "x=" << x << " " << "y=" << y << endl;
}
int main()
{
int x = 5;
int y = 6;
cout <<"原始数值为:"<< "x=" << x << " " << "y=" << y << endl;
swap(x,y);
cout <<"在main函数中使用swap函数后的数值为:"<< "x="<<x<<" "<<"y="<<y << endl;
return 0;
}
运行结果为:
结果显示,在swap函数中数据显示确进行了交换,但是在main函数中调用函数后显示,两个数据依然是和原始数据一样。
这是为什么呢?
因为在x,y 给swap传递参数的时候仅仅把数值传递给了形参,函数内的数据的交换,对函数意外的数据结果不起任何的影响,
即:在进行值传递时,函数的形参数据的变化不会改变实参的数据。
那么如何才能让函数中的形参的修改的同时,实参也发生变化呢?这时候就需要用到地址传递或者引用传递。
地址传递:将实参的地址传递给函数的形参
#include<iostream>
using namespace std;
void swap(int * p1, int * p2)
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(&a,&b);
cout <<"a=" << a << " " << "b=" << b << endl;
return 0;
}
结果为:
此时结果显示,在main中的实参确实发生了变化,这是因为函数的参数为两个指针,此时传递进去的已经不是数据了而是两个数据的内存地址,是在地址上进行的数据的交换,既然地址上的数据发生了变化,两个地址又分别对应实参a和b,即a和b的数据发生了变化。
引用传递:利用引用用形参修饰实参
形式:数据类型 &变量名 = 变量名
例如:
int a =10;
int &b = a;//这是变量a被b引用,即a和b指向同一块内存
参数传递程序:
#include<iostream>
#include<string>
using namespace std;
void swap(int &x,int &y)
{
int temp;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 10;
int b = 20;
swap(a,b);
cout << "a=" << a << endl;
cout << "b=" << b << endl;
return 0;
}
结果:
结果显示,用引用传递可以用形参修饰实参
引用注意事项:
引用必须初始化
引用在初始化后不可再改变
引用
引用的本质就是在C++内部实现一个指针常量,
例如:
int &ref = a; 编译器内部会自动转化为:int * const ref = &a; 这也解释了为什么引用一旦初始化不能再改变。
常量引用:
作用:const 修饰引用后,引用的数值不可再修改
注意:
int & ref = 10;//这样写是错误的,因为引用必须是一个合法的地址
const int & ref = 10;//这样写是正确的,加上const后,编译器将代码修改为 int temp = 10; int & ref = temp;