C++函数参数传递方式决定内存行为和使用场景:值传递拷贝副本、引用传递零拷贝可修改原值、指针传递显式地址操作且可为空;选择依读写需求、对象大小及空值处理而定。

C++函数定义和调用本身不难,关键在参数传递方式的选择——值传递、引用传递、指针传递看似相似,实则内存行为和使用场景差异很大。
函数定义:声明接口 + 实现逻辑
定义函数需明确返回类型、函数名、形参列表和函数体。形参类型直接决定后续调用时的传递行为。
- 形参写成 int x → 默认按值传递,函数内修改不影响实参
- 形参写成 int& x → 引用传递,函数内可直接修改原始变量
- 形参写成 int* x → 指针传递,需传地址(如 &a),通过 *x 修改所指内容
函数调用:实参与形参的匹配规则
调用时传入的实际参数(实参)必须能隐式转换为形参类型,否则编译报错。尤其注意 const 限定和临时对象限制:
- 非 const 引用不能绑定到临时对象(如 func(5) 调用 void func(int&) 会失败)
- const 引用可以绑定临时对象(void func(const int&) 允许传 5)
- 指针传递必须确保地址有效,避免传 nullptr 后未检查就解引用
三种传参方式的核心区别
本质区别在于函数是否拥有变量的“访问权”和“修改权”:
立即学习“C++免费学习笔记(深入)”;
- 值传递:拷贝一份副本,安全但有开销;适合小对象(int、double)或不希望被修改的场景
- 引用传递:别名机制,零拷贝,可读可写;适合大对象(string、vector)或需修改原值的情况
- 指针传递:显式地址操作,可为空、可重定向;适合需要表示“无值”(nullptr)或动态调整指向的场合
实用建议:怎么选?
没有绝对最优,只有更合适:
- 只读大对象 → 用 const T&(如 void print(const std::string& s))
- 需要修改原对象 → 用 T&(如 void swap(int& a, int& b))
- 允许为空或需换指向 → 用 T*(如 void init(int* p),内部可能赋新地址)
- 内置小类型(int、char、bool)→ 值传递更自然,现代编译器常优化掉拷贝
基本上就这些。记牢形参怎么写,就决定了实参怎么传、函数里怎么用。








