引用参数

我们常常看到函数的形参带有引址符,其实那不是引址符,而是引用参数。引用参数是个什么鬼东东?

引用参数是由调用部位传入 实参的地址(写在留言板上)的 形参
形参表中以符号“&”开始的参数即为引用参数。如果一个 形参是引用参数,调用部位将把 实参的地址传递给 子程序子程序可以改变传递给引用参数的任何 实参,因为子程序操作的是真正的 变量,而不是它的副本。
把参数声明成引用,实际上改变了缺省的按值传递参数的传递机制,在按值传递时,函数操纵的是实参的本地拷贝。


以上来内容自百度百科


最关键的点是:参数是引用时,函数接收的是实参的左值而不是值的拷贝。这意味着函数知道实参在内存中的位置,因而能够改变它的值或取它的地址。


另外再提一下指针做参数:

(函数原型里)参数用指针,允许数值经参数传入函数,运算结果可以经参数带回调用处。
(函数原型里)参数不用指针,允许数值经参数传入函数,但运算结果 不能 经参数 带回 调用处。

测试如下:

#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,楼主写过一些树的题目,在创建树的时候常常要将根节点的指针前加上引用符,否则之后的程序无法找到已创建的树。经楼主分析认为,若不加引用符,函数操纵的只是一个副本,而真正的根节点的指针任是初始状态,故而之后的程序无法找到已创建的树。(这一点其实是第二点活生生的例子,只是楼主曾在这一点上纠结了许久,故单独拿出来强调一下大哭


我们可以声明任意内置数据类型的引用参数

例如,如果程序员想修改指针本身,而不是指针引用的对象,那么他可以声明一个参数,该参数是一个指针的引用,例如:下面是交 换两个指针的函数
void ptrswap( int *&v1, int *&v2 ) {

int *tmp = v2; v2 = v1; v1 = tmp;

}


  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值