看书,发现画红线的地方不理解,有大佬解释一下为什么吗?
在函数传参和返回时,其实都会发生一次浅拷贝,假设:
int x = 3, y = 1;
max_value(3,1); //调用函数,那么在调用函数的过程中,执行过程为:
在max_value(int a,int max)函数中,重新声明一个变量a和max,并让a=x,max = y(这就是所谓的浅拷贝),所以在max_value函数中操作的实际上是a和max的值,并不会对x和y的值产生影响。
如果,max_value函数修改如下:
void max_value(int a,int*max)
{
if(a>*max) *max = a;
}
那么操作的就是y的内存,这种情况下就会对外面的值产生影响。
C++中也有引用的概念,引用就是变量的一个别名,当函数使用引用作为参数时,不会发生浅拷贝,传入函数的就是变量本身,所以在函数中的操作也会影响函数外变量的值。
引用方式:
void max_value(int a,int& max)//跟你图片中的代码,仅仅只多了一个&符号
{
if(a>max) max = a;
}
记住一句话,形参的值不会影响实参,除非是引用和指针。
也就是说像他这么写
void Func(int a,int max);//定义
Func(x,y);//调用
你修改a和max的值不会影响到实参x和y。
但是如果是
void Func(int &a,int &max);//定义Func,&为引用
void Func2(int *a,int *max);//定义Func,参数为指针
Func(x,y);//调用
Func2(&x,&y);
那你对a和max的的修改都会影响到x和y的。
引用本质上来说就是变量的别名,或者外号,乳名,你想怎么叫就怎么叫,相当于它和实参是同一个东西,只不过名字不同罢了。而指针的本质是地址,类似门牌号,门牌号还是固定的,但是人可能会被你换掉了