参数传递问题?
在看书的时候看到一个关于函数参数传递的问题,不是很懂,大家帮忙看一下。
void f(int val,int &ref)
{
val ++;
ref ++;
}
而在调用时:
int i=1;
int =1;
f(i,j);
为什么书上说j增量而i不增量?解释是第一个参数i是值传递,第二个参数j是引用传递。
不是很明白它解释的。
[解决办法]
i是按值传递的,传进去的只是i的一份拷贝,你在函数f()内对val的操作与i没有任何关系。
j是按引用传进去的,ref和j是同一个东西, 你对ref的操作就是对j的操作
[解决办法]
引用是对指针的隐藏或封装,它是已初始化内存地址中变量的另一个名字,通过它,你可以像操作该变量一样,操作那块内存地址区。引用可以看作更安全、方便的指针。
[解决办法]
第一个参数是传值,进入函数体后会生成一个临时的变量,然后把传进来的值赋给这个临时变量,在函数体内对第一个参数的操作就是对这个临时变量的操作。修改了临时变量的值,但是并没有修改第一个参数的值;
第二个是传引用,不会生成临时变量,在函数体内对第二个参数的操作就是直接作用在第二个参数上。并不是作用在什么临时变量上。
基于传引用不会生成临时变量,很多时候需要传“大参数”的时候(大指的的是参数所占内存空间大),都会采用传引用或者指针...
希望对你有所帮助。
[解决办法]
其实呢,按值传递的话,在函数调用时传入的参数,比如
int a = 5;
fuction(a);
这样的语句,会在传入时新建一个临时的变量,把a的值赋给这个临时的变量,然后就和a没什么关系了
所以,a的值一定不会改变。但是传引用的话,由于引用是内存变量的别名,这样的话相当于把a传入,这样
修改的就是a本身了。指针是把a的内存地址传入,修改这人内存了址里的值自然就是修改a的值了,都可以
对参数进行修改的。
[解决办法]
函数的第二个参数是引用
对于引用的参数,对引用对象的操作就是对实参(j)的操作,所以j会变
而第一个参数是按值传递方式、
对其进行操作只是对实参(i)的副本进行操作,实参(i)不会变
所以这就是引用参数和按值传递方式的最主要的区别
C++Primer 第3版本上讲的很清楚