以上来内容自百度百科。
最关键的点是:参数是引用时,函数接收的是实参的左值而不是值的拷贝。这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。
另外再提一下指针做参数:
(函数原型里)参数用指针,允许数值经参数传入函数,运算结果可以经参数带回调用处。
(函数原型里)参数不用指针,允许数值经参数传入函数,但运算结果 不能 经参数 带回 调用处。
测试如下:
#include <stdio.h>
using namespace std;
void ff(int *x,int *y){
*x=2;*y=1;
}
int main(){
int x=1,y=2;
ff(&x,&y);
printf("%d %d\n",x,y);
return 0;
}
输出结果为:2 1
#include <stdio.h>
using namespace std;
void ff(int *x,int *y){
int *z;
z=x;x=y;y=z;
}
int main(){
int x=1,y=2;
ff(&x,&y);
printf("%d %d\n",x,y);
return 0;
}
输出结果为:1 2
引用形参函数一开始接收的值为地址,测试如下:
#include <stdio.h>
using namespace std;
void ff(int &x,int &y){
printf("%d %d\n",x,y);
}
int main(){
int x,y;
ff(x,y);
return 0;
}
#include <stdio.h>
using namespace std;
void ff(int &x,int &y){
x=1;y=2;
}
int main(){
int x=3,y=4;
ff(x,y);
printf("%d %d\n",x,y);
return 0;
}
输出结果为:1 2
而我们在函数中可以改变x,y的值并将其传递回原函数,相当于直接操纵x,y.
那么,引用参数有什么作用呢?
1,引用参数可以有额外的返回结果,即被引用的参数相当于是额外的返回结果了。
2,需要改变实参的值,例如拓展欧几里得算法。
3,向函数传递大型的类对象。关于这一点楼主还不懂,先mark。
4,楼主写过一些树的题目,在创建树的时候常常要将根节点的指针前加上引用符,否则之后的程序无法找到已创建的树。经楼主分析认为,若不加引用符,函数操纵的只是一个副本,而真正的根节点的指针任是初始状态,故而之后的程序无法找到已创建的树。(这一点其实是第二点活生生的例子,只是楼主曾在这一点上纠结了许久,故单独拿出来强调一下)
我们可以声明任意内置数据类型的引用参数
int *tmp = v2; v2 = v1; v1 = tmp;
}