C++ 函数参数传递时,值传递、引用传递、指针传递有什么区别?

 Hi~!欢迎来到碧波空间,平时喜欢用博客记录学习的点滴,欢迎大家前来指正,欢迎欢迎~~
✨✨ 主页:碧波
📚 📚 专栏:C++ 系列文章

目录

值传递

引用传递

指针传递

总结比较

使用场景


在 C++ 中,函数参数传递方式包括指针传递、引用传递和值传递,它们各自有不同的特点和应用场景。下面详细解释它们的区别,并提供相应的示例代码。

值传递

值传递是将 实参的值 复制一份给形参,函数内部操作的是这份复制的值,不影响原始实参的值。

#include <iostream>

// 函数定义,值传递
void increment(int x) {
    x++;  // 修改形参的值
    std::cout << "Inside function: x = " << x << std::endl;
}

int main() {
    int num = 10;
    std::cout << "Before function call: num = " << num << std::endl;
    
    increment(num);  // 调用函数,值传递
    
    std::cout << "After function call: num = " << num << std::endl;
    
    return 0;
}

// 输出结果
Before function call: num = 10
Inside function: x = 11
After function call: num = 10

在这个例子中,函数 increment 中的 xnum 的一个副本,因此对 x 的修改不会影响到 num 的值。

🎯 特点

 形参接收的是实参的副本。

 函数内对形参的修改不会影响到原始实参。

引用传递

引用传递 使用引用 作为函数的参数,函数内部直接操作原始实参的值,可以看作是原始实参的别名。

#include <iostream>

// 函数定义,引用传递
void increment(int &x) {
    x++;  // 修改引用的值,即修改了原始实参的值
    std::cout << "Inside function: x = " << x << std::endl;
}

int main() {
    int num = 10;
    std::cout << "Before function call: num = " << num << std::endl;
    
    increment(num);  // 调用函数,引用传递
    
    std::cout << "After function call: num = " << num << std::endl;
    
    return 0;
}

// 输出结果
Before function call: num = 10
Inside function: x = 11
After function call: num = 11

在这个例子中,函数 increment 中的 xnum 的引用,修改 x 实际上修改了 num 的值。

🎯 特点

 形参是原始实参的别名,直接操作原始实参的值。

 函数内对形参的修改会影响到原始实参。

指针传递

指针传递与引用传递类似,但 使用指针 作为函数的参数,需要注意的是指针本身也是一个变量,存储的是地址,因此需要在函数内通过解引用操作来访问或修改原始实参的值。

#include <iostream>

// 函数定义,指针传递
void increment(int *ptr) {
    (*ptr)++;  // 通过指针修改原始实参的值
    std::cout << "Inside function: *ptr = " << *ptr << std::endl;
}

int main() {
    int num = 10;
    std::cout << "Before function call: num = " << num << std::endl;
    
    increment(&num);  // 调用函数,指针传递
    
    std::cout << "After function call: num = " << num << std::endl;
    
    return 0;
}

// 输出结果
Before function call: num = 10
Inside function: *ptr = 11
After function call: num = 11

函数 increment 中的 ptrnum 的地址,通过解引用 ptr 可以修改 num 的值。

🎯 特点

 形参是指向原始实参的指针,需要通过 解引用 操作来访问或修改原始实参的值。

 可以通过传递 nullptr 来处理空指针的情况。

总结比较

值传递:复制实参的值给形参,函数内部操作的是副本,不影响原始值。

 引用传递:形参是原始实参的别名,函数内部操作影响原始值。

 指针传递:形参是原始实参的地址,函数内部通过解引用操作影响原始值。

使用场景

如果想修改原始值且不担心性能损失,可以使用引用传递;

如果可能不想修改原始值或者需要在函数内部修改原始值,可以使用指针传递;

如果只是需要值的副本且不影响原始值,可以使用值传递。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

碧 波

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

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

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

打赏作者

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

抵扣说明:

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

余额充值