【C++】015、函数参数:值传递,指针传递,引用传递的区别

一、本质区别

1、值传递是赋值粘贴,函数内获取的副本,不影响外部

2、指针传递的是"邮寄地址",可通过地址间接修改外部对象

3、引用传递的是别名绑定,可直接操作原对象

二、比对

|------------|-------------|---------------|---------------|
| 对比维度 | 值传递 | 指针传递 | 引用传递 |
| 传递内容 | 实参的副本(全新拷贝) | 实参地址(拷贝地址值) | 实参的别名(底层也是地址) |
| 能否修改外部实参 | 不能(改的是副本) | 能(通过解引用*ptr) | 能(直接操作原对象) |
| 内存开销 | 打(拷贝整个对象) | 小(拷贝8字节地址) | 小 |
| 空值(null)风险 | 无 | 有(空指针需判断空) | 无(引用必须事先绑定对象) |

  • 代码:
cpp 复制代码
#include <iostream>
#include <string>

// 1. 值传递:改的是副本
void byValue(std::string s) {
    s += "_copy";   // 只影响局部副本
}

// 2. 指针传递:通过地址修改原对象
void byPointer(std::string* s) {
    if (s) {        // 必须判空!
        *s += "_ptr";
    }
}

// 3. 引用传递:直接修改原对象
void byReference(std::string& s) {
    s += "_ref";
}

int main() {
    std::string str = "Hello";
    
    byValue(str);
    std::cout << str << std::endl;  // 输出 "Hello"(未变)
    
    byPointer(&str);
    std::cout << str << std::endl;  // 输出 "Hello_ptr"
    
    byReference(str);
    std::cout << str << std::endl;  // 输出 "Hello_ptr_ref"
}

三、引用使用场景

1、需要修改实参

cpp 复制代码
void swap(int& a, int& b) { int tmp = a; a = b; b = tmp; } 

2、传递大对象,只读不写使用const引用

cpp 复制代码
void printVector(const std::vector<int>& v) { // 避免拷贝百万个元素
    for (int x : v) std::cout << x;
}

3、保留派生类信息,实现多态

cpp 复制代码
class Animal { virtual void speak(){} };
class Cat : public Animal { void speak() override {} };

void play(Animal& a) { a.speak(); } // 传 Cat 也能正确调用 Cat::speak()

4、运算符重载

cpp 复制代码
int& operator[](size_t idx) { return data[idx]; }

四、使用指针的场景

1、参数可选,可能为空

2、需要动态改变指针指向的对象

  • 指针可指向另外的对象地址,而引用不允许

3、与C语言交互,C语言没有引用,使用指针传递(void*)

相关推荐
马可家的菠萝4 小时前
Vue3 + Canvas 手绘笔记工程化实践:别把画布只当成一张 PNG
前端·vue.js·算法
watersink4 小时前
机器学习极大似然估计与EM算法
人工智能·算法·机器学习
叠层归一研究院4 小时前
如何用程序搭建一个 AGI 种子系统(一):从向量种子到无限生长引擎
人工智能·python·算法·机器学习·agi
科学实验家4 小时前
并 查集
算法
xiaohebang5 小时前
流失预测模型设计:行为特征分析算法选型
大数据·数据结构·经验分享
AI服务老曹5 小时前
视觉算法模型管理性能优化指南:多版本平滑升级、灰度与快速回滚实战
算法·性能优化
l1258655 小时前
# RAG重排序实战:硅基流动bge-reranker-v2-m3在线API vs 本地CrossEncoder,一篇讲透两种方案
数据库·人工智能·python·深度学习·算法·机器学习·langchain
创世宇图5 小时前
【AI量化交易实战】第06讲:小雅再升级——Talib指标库与K线形态量化
算法
机器学习之心6 小时前
CPO-SVR:用冠豪猪优化算法给支持向量回归机“自动调参“,一次预测多个指标
算法·回归·cpo-svr
Super 含6 小时前
Android 启动优化(三):Perfetto 实战——启动时间到底花在哪里?
jvm·算法