导读:本期聚焦于小伙伴创作的《C++函数参数传递方式有哪些 值传递引用传递指针传递区别》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++函数参数传递方式有哪些 值传递引用传递指针传递区别》有用,将其分享出去将是对创作者最好的鼓励。

在C++中,函数参数传递主要有值传递、引用传递和指针传递三种方式,三者的底层实现逻辑和实际表现存在明显差异,理解这些差异是写出高效正确代码的基础。

C++函数参数传递方式有哪些 值传递引用传递指针传递区别

值传递

值传递是最基础的参数传递方式,调用函数时会将实参的值复制一份传递给形参,形参和实参是两个独立的变量,占用不同的内存空间。

在函数内部修改形参的值,不会影响到外部的实参,因为操作的是复制出来的副本。值传递适用于传递小型内置类型数据,或者不需要修改外部变量的场景。

#include <iostream>
using namespace std;

// 值传递函数,修改形参不会影响实参
void valuePass(int num) {
    num = 20;
    cout << "函数内形参值: " << num << endl;
}

int main() {
    int a = 10;
    valuePass(a);
    cout << "函数外实参值: " << a << endl;
    return 0;
}

上述代码执行后,函数内输出20,函数外输出10,说明形参的修改没有影响到实参。

引用传递

引用传递是给实参起一个别名,形参和实参指向同一块内存空间,对形参的修改本质上就是对实参的修改。引用传递不需要复制实参的值,效率更高,适合传递大型对象或者需要修改外部变量的场景。

引用必须在定义的时候初始化,且之后不能再引用其他变量,这是引用传递的重要特性。

#include <iostream>
using namespace std;

// 引用传递函数,修改形参会同步影响实参
void referencePass(int &num) {
    num = 20;
    cout << "函数内引用值: " << num << endl;
}

int main() {
    int a = 10;
    referencePass(a);
    cout << "函数外实参值: " << a << endl;
    return 0;
}

上述代码执行后,函数内和函数外都会输出20,说明形参的修改直接作用到了实参上。

指针传递

指针传递是将实参的地址传递给形参,形参是一个指针变量,存储的是实参的内存地址。通过解引用指针可以访问和修改实参的值,本质上也是操作实参所在的内存空间。

指针传递和引用传递都能实现修改外部变量的效果,但指针本身是一个独立的变量,可以为空,也可以修改指向的地址,这是和引用传递的核心差异之一。

#include <iostream>
using namespace std;

// 指针传递函数,通过解引用指针修改实参
void pointerPass(int *num) {
    if (num != nullptr) { // 避免空指针解引用
        *num = 20;
        cout << "函数内指针解引用值: " << *num << endl;
    }
}

int main() {
    int a = 10;
    pointerPass(&a);
    cout << "函数外实参值: " << a << endl;
    return 0;
}

上述代码执行后,函数内和函数外都会输出20,和引用传递的效果类似,但实现方式是通过地址操作完成的。

三种传递方式的区别对比

为了更清晰地理解三者的差异,我们可以从多个维度进行对比:

对比维度值传递引用传递指针传递
是否复制实参是,复制完整值否,是实参的别名否,复制的是实参地址
是否影响外部实参是(解引用后)
是否可以为空无此概念不可以,必须初始化可以,指针可以为nullptr
传递效率低(复制开销大时)
适用场景小型内置类型、无需修改实参大型对象、需要修改实参、避免复制开销需要动态判断地址有效性、兼容C语言接口

场景选择建议

在实际开发中,我们可以根据需求选择合适的传递方式:

  • 如果传递的是小型内置类型,且不需要修改外部变量,优先选择值传递,代码更直观。
  • 如果传递的是大型对象,或者需要修改外部变量,优先选择引用传递,效率更高且语法更简洁。
  • 如果需要兼容C语言接口,或者需要判断传递的地址是否有效(允许空值),可以选择指针传递。

需要注意的是,如果不想在函数内修改实参,即使使用引用传递或指针传递,也可以加上const修饰,避免误操作修改外部变量,比如void func(const int &num)或者void func(const int *num)

C++值传递引用传递指针传递参数传递修改时间:2026-06-20 15:06:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。