C++ 函数形参中 float、float*、float& 的区别详解

 更新时间:2026年08月30日 11:34:50   作者:INS_KF  
这篇文章介绍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&amp; 的区别详解的文章就介绍到这了,更多相关C++ float、float*、float&amp; 区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

最新评论