C++三种参数传递方式:从交换函数看值、指针与引用的区别

本篇文章将通过一个简单的交换函数示例,详细介绍C++中的三种参数传递方式:值传递指针传递引用传递。我们会分析每种方式的特点以及它们在函数调用中对实参的影响。

代码预览

cpp 复制代码
#include <iostream>
using namespace std;

// 1. 值传递
void Swap01(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
}

// 2. 指针传递
void Swap02(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 3. 引用传递
void Swap03(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

int main() {
    int a = 10;
    int b = 20;

    Swap01(a, b);
    cout << "Swap01 a=" << a << ", b=" << b << endl;

    Swap02(&a, &b);
    cout << "Swap02 a=" << a << ", b=" << b << endl;

    Swap03(a, b);
    cout << "Swap03 a=" << a << ", b=" << b << endl;

    return 0;
}

三种传递方式详解

1. 值传递 (Swap01)

  • 形参类型int a, int b

  • 调用方式Swap01(a, b)

  • 工作原理:函数接收的是实参的副本,函数体内交换的只是两个局部变量,不会影响函数外部的实参。

  • 结果 :调用后 ab 的值保持不变(10 和 20)。

2. 指针传递 (Swap02)

  • 形参类型int* a, int* b

  • 调用方式Swap02(&a, &b)

  • 工作原理:函数接收实参的地址(指针),通过解引用操作直接修改指针所指向的内存单元,从而改变实参的值。

  • 结果 :调用后 ab 的值发生交换(20 和 10)。

3. 引用传递 (Swap03)

  • 形参类型int &a, int &b

  • 调用方式Swap03(a, b)

  • 工作原理:引用是实参的别名,函数内部直接操作实参本身,无需解引用,语法简洁且高效。

  • 结果 :调用后 ab 的值发生交换(又变回 10 和 20)。

程序执行流程分析

让我们逐步跟踪 main 函数中的执行过程:

  1. 初始状态a = 10, b = 20

  2. 调用 Swap01 :值传递,函数内部交换副本,不影响实参。输出结果 a=10, b=20

  3. 调用 Swap02 :指针传递,函数通过地址修改实参。交换后 a=20, b=10。输出结果 a=20, b=10

  4. 调用 Swap03 :引用传递,函数直接操作实参。此时 a=20, b=10,交换后 a=10, b=20。输出结果 a=10, b=20

最终我们看到,由于 Swap02Swap03 先后进行了两次交换,ab 的值又回到了初始状态。如果单独调用 Swap03,它也能正确地交换两个变量的值。

为什么最终 a 和 b 没有变化?

初学者可能会误以为 Swap03 没有生效,其实是因为前面的 Swap02 已经交换了一次,Swap03 又交换回来,导致最终结果与初始相同。若要验证引用传递的正确性,可以注释掉前两个函数调用,只保留 Swap03 的调用:

cpp 复制代码
int main() {
    int a = 10, b = 20;
    Swap03(a, b);
    cout << "a=" << a << ", b=" << b << endl; // 输出 a=20, b=10
    return 0;
}

引用传递的优势

语法简洁:使用起来和值传递一样自然,无需取地址和解引用。

效率高:传递的是变量的别名,不会产生副本,尤其适合传递大型对象。

安全:引用在声明时必须初始化,且一旦绑定不能更改,避免了空指针等问题。

总结

值传递:形参是实参的副本,函数内修改不影响外部。

指针传递:形参是指针,通过地址间接访问实参,能修改外部变量。

引用传递:形参是实参的别名,直接操作实参,兼具指针的效率和值传递的简洁性。

在C++中,引用传递常被用于需要修改实参或避免拷贝开销的场景,是推荐使用的参数传递方式之一。希望通过本文的讲解,你对这三种传递方式有了更清晰的理解。

相关推荐
qq_199886872 小时前
第6板块·第4节:构建系统与多文件项目
c++·人工智能·gpu算力
2601_966949653 小时前
只拿到股票代码还不够:量化程序到底还需要哪些标的信息?——从数据建模开始理解股票元数据
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
m0_734571763 小时前
深入理解5g <十八>传输块tbsize的计算
开发语言·5g
汉克老师4 小时前
GESP2026年9月认证C++三级( 第三部分编程题(2、分割字符串))精讲
c++·gesp·小学生·学c++编程
估值探索者4 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘
RAN11426760084 小时前
1.3第一个程序的介绍
开发语言·qt
天若有情6734 小时前
C++花式魔改!手写头文件复刻Java语法,彻底打破编码思维定式
java·c++·语言做语言·jac++
qq_199886875 小时前
第7板块·第3节:CUTLASS 的 GEMM 实现与优化策略
c++·人工智能·gpu算力·cuda
hetao17338375 小时前
2026-09-17 hetao1733837 的刷题记录
c++·算法
blue_ice .5 小时前
Verilog DDS 数字信号发生器:DAC 输出模拟波形与 ADC 回采观测
开发语言·单片机·嵌入式硬件·fpga开发