C++ 函数形参中 float、float*、float& 的区别详解
核心区别在于传递机制、是否可修改实参、语法要求及安全性:
表格
| 形参类型 | 传递方式 | 能否修改实参值 | 调用写法 | 空值检查 | 拷贝开销 |
|---|---|---|---|---|---|
float | 传值(拷贝) | ❌ 否(仅改副本) | func(a) | 无需 | 有(4 字节) |
float* | 传指针(拷贝地址) | ✅ 是(通过 *ptr) | func(&a) | ✅ 需判空(可为 nullptr) | 有(指针大小,通常 8 字节) |
float& | 传引用(别名绑定) | ✅ 是(直接操作原对象) | func(a) | ❌ 不可为空(必须绑定有效对象) | 无(零拷贝) |
关键行为说明
-
float(值传递)- 形参是实参的独立副本;函数内任何修改不影响原变量。
- 适用于只读或无需反馈结果的场景。
-
float*(指针传递)- 形参是指针的副本,但指向同一内存;
*ptr = x可修改原值,但ptr = &y仅改局部指针,不影响实参指针本身。 - 需显式解引用,调用者负责传地址;支持空指针,增加灵活性但需防御性编程。
- 形参是指针的副本,但指向同一内存;
-
float&(引用传递)- 形参是实参的别名;所有操作直接作用于原对象。
- 语法更简洁安全(无需
&/*,不可为空),C++ 推荐优先用于“需修改且保证有效”的场景。 - 若需避免修改,应使用
const float&。
💡 实践建议:
- 小类型(如
float)且无需修改 → 用float(现代编译器优化后拷贝成本极低); - 需修改且确保对象存在 → 优先
float&; - 需表达“可选”语义(可能为空)或操作动态内存 → 用
float*(或更安全的std::optional<float&>/ 智能指针组合)。
注意:float*&是“指针的引用”,可修改指针本身指向,与上述三者不同,慎用。
1.float value:值传递
void func(float value);
调用:
float a = 10.0f; func(a);
特点:
- 函数接收到的是
a的副本。 - 函数内部修改
value,不会影响原来的a。 float、int、uint8_t等基本类型,如果只需要读取数据,通常优先使用值传递。
2.float *value:指针传递
void func(float *value);
调用:
float a = 10.0f; func(&a);
函数内部:
void func(float *value)
{
*value = 20.0f;
}执行后:
a == 20.0f;
特点:
- 传入的是变量的内存地址。
- 可以通过
*value修改原变量。 - 调用时通常需要使用
&取地址。 - 可以传入
nullptr。 - 常用于数组、数据缓冲区和底层通信函数。
例如:
void sendData(uint8_t *data, int len);
3.float &value:引用传递
void func(float &value);
调用:
float a = 10.0f; func(a);
函数内部:
void func(float &value)
{
value = 20.0f;
}
执行后:
a == 20.0f;
特点:
value可以理解为原变量的别名。- 修改
value就是修改原变量。 - 调用时不需要使用
&。 - 当参数一定存在,并且函数需要修改它时,通常比指针更直观。
4. 三种方式对比
| 写法 | 含义 | 能否修改原变量 | 调用方式 |
|---|---|---|---|
float value | 值传递 | 否 | func(a) |
float *value | 指针传递 | 是 | func(&a) |
float &value | 引用传递 | 是 | func(a) |
5. 实际选择原则
只需要读取基本类型
使用:
void func(float value);
需要修改调用者的变量
优先考虑引用:
void calculateValue(float &value);
需要传递地址、数组或缓冲区
使用指针:
void processData(uint8_t *data, int len);
大型对象只读取
通常使用 const 引用:
void func(const QString &str); void func(const MyStruct &data);
这样既可以避免对象复制,又可以防止函数修改原数据。
6. 最简单的记忆方法
只读取一个基本类型
→ float value
需要修改原变量
→ float &value
需要地址、数组、缓冲区、允许 nullptr
→ float *value
大型对象只读取
→ const Type &value另外需要特别区分:
void func(float &value);
这里的 & 表示引用。
而:
float a = 10.0f; func(&a);
这里的 &a 表示取得变量 a 的地址。
两者虽然都使用 &,但含义不同。
到此这篇关于C++ 函数形参中 float、float*、float& 的区别详解的文章就介绍到这了,更多相关C++ float、float*、float& 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
深入C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程总结
本篇文章是对C++中构造函数、拷贝构造函数、赋值操作符、析构函数的调用过程进行了总结与分析,需要的朋友参考下2013-05-05
解决Visual Studio Code错误Cannot build and debug because
这篇文章主要为大家介绍了解决Visual Studio Code错误Cannot build and debug because the及分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2023-07-07
C++ 中实现把EXCEL的数据导入数据库(ACCESS、MSSQL等)实例代码
这篇文章主要介绍了C++ 中实现把EXCEL的数据导入数据库(ACCESS、MSSQL等)实例代码的相关资料,需要的朋友可以参考下2017-04-04
Species Tree 利用HashTable实现实例代码
这篇文章主要介绍了Species Tree 利用HashTable实现实例代码的相关资料,需要的朋友可以参考下2017-01-01


最新评论