学习C/C++ 将引用用作函数参数 详解

文章讲述了C++中按引用、指针和值传递函数参数的区别,通过`swapr()`和`swapp()`函数展示了引用和指针如何影响实参的修改。引用使函数可以直接操作变量,而值传递则是复制副本,不直接影响原值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        将引用用作函数参数

      引用经常被用作函数参数,使得函数中的变量名成为调用程序中的变量别名就是说,此时函数的形参和实参是同一个东西)。这种传递参数的方式称为 按引用传递按引用传递 允许被调用的函数访问调用函数中的变量在函数的形参中去操作实参的别名(引用),就等于直接操作实参)。C++新增的这项特性是对C语言的超越C语言除了指针传递的方式,只能按值传递按值传递导致被调用函数使用调用程序的值的拷贝

#include <iostream>
using namespace std;
void swapr(int &a,int &b);
void swapp(int *p,int *q);
void swapv(int a,int b);
int main()
{
        int wallet1 = 300;
        int wallet2 = 350;
        cout << "wallet1 = " << wallet1 << endl;
        cout << "wallet2 = " << wallet2 << endl;
        cout << "Using references to swap contents:\n";
        swapr(wallet1,wallet2);
        cout << "wallet1 = " << wallet1 << endl;
        cout << "wallet2 = " << wallet2 << endl;
        cout << "Using pointers to swap contents again:\n";
        swapp(&wallet1,&wallet2);
        cout << "wallet1 = " << wallet1 << endl;
        cout << "wallet2 = " << wallet2 << endl;
        cout << "Tring to use passing by value:\n";
        swapv(wallet1,wallet2);
        cout << "wallet1 = " << wallet1 << endl;
        cout << "wallet2 = " << wallet2 << endl;
        return 0;
}
void swapr(int &a,int &b)
{
        int temp;
        temp = a;
        a = b;
        b= temp;
}
void swapp(int *p ,int *q)
{
        int temp;
        temp = *p;
        *p = *q;
        *q = temp;
}
void swapv(int a,int b)
{
        int temp;
        temp = a;
        a = b;
        b = temp;
}

 

可以看到使用引用和指针的方式,wallet1和wallet2正确交换

引用传递(swapr())按值传递(swapv())按地址传递(sawpp())

swapr(wallet1,wallet2);
swapv(wallet1,wallet2);

        其中swapr()swapv()在使用的时候看起来相同。只能通过函数原型或者函数定义才能知道swapr()是按引用传递的。而地址运算符(&)使得按地址传递swapp(&wallet1,&wallet2)一目了然(类型声明int *p表明了,p是一个int指针,所以与p对应的参数应为地址)。

        swapr()swapv()代码唯一的外在区别声明函数参数的方式不同

void swapr(int &a,int &b);
void swapv(int a,int b);

        swapr()swapv()内在区别:

        在swapr()中,变量a和b是wallet1和wallet2的别名所以交换a和b等于交换 wallet1和wallet2;但是在swapv()中,变量a和b是复制了wallet1和wallet2的值的新变量因此交换了a和b的值并不会影响wallet1和wallet2的值

        比较函数swapr()(传递引用)swapp()(传递指针)第一个区别是声明函数参数的方式不同

void swapr(int & a,int & b);
void swapp(int * p,int & q);

        另一个区别是指针版本需要再函数使用p和q的整个过程中使用解引用运算符*。 

        应该在定义应用变量时对其进行初始化函数调用使用实参初始化形参,因此函数的引用参数被初始化为函数调用传递的实参也就是说,下面的函数调用将形参a和b分别初始化为wallet1和wallet2:

swapr(wallet1,wallet2);
       
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃三文鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值