C++中使用&和*声明的函数参数之间的差异

2022-04-09 00:00:00 function pass-by-reference pointers c++

我键入了以下示例:

#include <iostream>
double f(double* x, double* y)
{
    std::cout << "val x: " << *x << "
";
    std::cout << "val y: " << *y << "
";
    return *x * *y;
}
double f2(double &x, double &y)
{
    std::cout << "val x: " << x << "
";
    std::cout << "val y: " << y << "
";
    return x * y;
}
int main()
{
    double a, b;
    a = 2;
    b = 3; 
    std::cout << f(&a, &b) << "
";
    std::cout << f2(a, b) << "
";
    return 0;
}   

在函数f中,我将x和y声明为指针,可以使用*x获取它们的值。当调用f时,我需要传递我传递的参数的地址,这就是我传递&a, &b的原因。f2相同,只是定义不同。

现在我的问题是:它们在内存管理方面真的是一样的吗?都不复制传递的值,而是传递一个引用? 我想知道f2,因为我无法读出f2x的地址,所以了解f中的x和y(在那里我知道地址和值)。

提前谢谢!

编辑:好的,谢谢,在做了一些研究后,我发现了一个非常有用的主题:

Pointer vs. Reference 还有一个指向Google编码指南的链接http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments,这非常useful我觉得(据我现在所知,这是一种主题品味的形式)使更清楚


解决方案

f2通过引用获取其参数,这本质上是您传递的参数的别名。指针和引用的区别在于引用不能为空。对于f,您需要传递要传递给指针的参数的地址(使用&;运算符),当您通过引用传递参数时,只需传递参数即可创建别名。

传递常量引用(const double& ref)在您不打算更改函数内部的参数时是首选的,并且当您要更改它们时,使用非常量引用。

指针主要用于需要能够将NULL传递给参数的情况,显然,在使用它之前,您需要在函数内部检查指针是否不是NULL

相关文章