C++指针参数传递和值传递引用传递有什么区别

来源:APP编程网作者:星宫一花头衔:网络博主
导读:本期聚焦于小伙伴创作的《C++指针参数传递和值传递引用传递有什么区别》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++指针参数传递和值传递引用传递有什么区别》有用,将其分享出去将是对创作者最好的鼓励。

C++中函数参数传递是程序开发的基础操作,不同的传递方式会影响函数内部对参数的修改是否能反馈到外部,也会涉及不同的内存开销。常见的参数传递方式包括值传递、引用传递和指针参数传递,三者在实现逻辑和使用效果上存在明显差异。

C++指针参数传递和值传递引用传递有什么区别

三种参数传递方式的基本概念

值传递

值传递是C++默认的传递方式,函数调用时会将实参的值复制一份给形参,形参和实参是两个独立的变量,占用不同的内存空间。函数内部对形参的修改不会影响外部的实参。

引用传递

引用传递是给实参起一个别名,形参和实参指向同一块内存空间,函数内部对形参的修改会直接作用于实参。引用在定义时必须初始化,且之后不能再引用其他变量。

指针参数传递

指针参数传递是将实参的地址传递给形参,形参是指针变量,存储的是实参的内存地址。通过解引用指针可以访问和修改实参的值,本质上也是通过地址操作实参,但和引用传递的实现形式不同。

三种传递方式的代码示例对比

下面通过一个修改整型变量值的示例,直观展示三种传递方式的差异:

#include <iostream>
using namespace std;

// 值传递函数
void value_pass(int a) {
    a = 20; // 修改的是形参a,不影响外部实参
    cout << "值传递函数内a的值: " << a << endl;
}

// 引用传递函数
void reference_pass(int &a) {
    a = 30; // 修改的是实参的别名,直接影响外部实参
    cout << "引用传递函数内a的值: " << a << endl;
}

// 指针参数传递函数
void pointer_pass(int *a) {
    *a = 40; // 解引用指针修改指向的内存值,影响外部实参
    cout << "指针参数传递函数内a的值: " << *a << endl;
}

int main() {
    int num = 10;
    cout << "初始num的值: " << num << endl;

    value_pass(num);
    cout << "值传递调用后num的值: " << num << endl;

    reference_pass(num);
    cout << "引用传递调用后num的值: " << num << endl;

    pointer_pass(&num);
    cout << "指针参数传递调用后num的值: " << num << endl;

    return 0;
}

上述代码的运行结果为:

初始num的值: 10
值传递函数内a的值: 20
值传递调用后num的值: 10
引用传递函数内a的值: 30
引用传递调用后num的值: 30
指针参数传递函数内a的值: 40
指针参数传递调用后num的值: 40

从结果可以看出,值传递没有修改外部实参,而引用传递和指针参数传递都成功修改了外部的num变量。

三种传递方式的核心差异对比

我们可以通过以下维度对三种传递方式进行详细对比:

对比维度值传递引用传递指针参数传递
内存开销复制实参的完整值,开销随实参类型大小变化无额外内存开销,只是别名复制地址值,固定为一个指针大小的开销
是否影响实参不影响影响影响(需解引用操作)
是否可以为空无此概念不可以,引用必须初始化绑定有效变量可以,指针可以赋值为nullptr
是否需要解引用不需要不需要,直接使用形参即可需要,通过*操作符解引用才能访问实参
重新赋值能力形参可以随意修改,不影响实参修改形参等于修改实参,不能重新绑定其他变量指针本身可以重新指向其他地址

适用场景分析

  • 值传递适合传递小型内置类型,比如int、char等,或者不需要修改实参、只需要使用实参值的场景,逻辑简单清晰。
  • 引用传递适合需要修改实参,且确定实参一定有效的场景,比如函数需要返回多个结果时,用引用作为输出参数,代码更简洁。
  • 指针参数传递适合需要修改实参,且实参可能为空、或者需要在函数内切换指向不同变量的场景,比如操作动态分配的内存、链表节点修改等场景。

注意事项

使用指针参数传递时,需要注意判断指针是否为空,避免解引用空指针导致程序崩溃,示例代码如下:

void safe_pointer_pass(int *a) {
    if (a == nullptr) { // 先判断指针是否为空
        cout << "指针为空,无法修改" << endl;
        return;
    }
    *a = 50;
    cout << "安全指针传递修改后的值: " << *a << endl;
}

而引用传递因为必须绑定有效变量,不需要做空值判断,代码更简洁,但灵活性不如指针参数传递。

C++指针参数传递值传递引用传递参数传递对比修改时间:2026-07-14 04:00:28

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