c++ - 通过引用和指针传递参数

标签 c++ pointers pass-by-reference

我来自 C,我了解到,如果我们将参数传递给函数,它只会使用它的值创建它的拷贝,因此如果我们更改此变量值,则传递给函数的变量不会改变,因为它们显然是两个不同的变量,具有两个不同的地址,只是具有相同的值。 因此,在 C 中,如果我们想要更改传递给函数的参数,我们将传递带有参数地址的指针。

现在,在 C++ 中我们可以做同样的事情,但我们也可以这样做:

void changeValue(int& n)
{
    n = 10;
}

不仅我们没有取消引用来赋值,而且当我们将变量传递给函数时,我们按原样传递它,而不使用地址 (&) 运算符。 所以我不明白这里有什么区别? 如果我们不取消引用,它还是一个指针吗?另外,如果我们在没有 & 运算符的情况下按原样传递它,我们如何通过引用传递它? 有人可以帮我清理一些东西吗?

最佳答案

C++ 有指针(以保持与 C 的向后兼容性)和引用。对于指针,正如您所提到的,您正在处理地址、取消引用运算符等。对于 C++ 引用,您不必担心这一点,因为该引用是另一个变量的别名。也就是说,对引用所做的任何修改都将反射(reflect)在实际变量中。

编译器可以将引用实现为指针,但这不是必需的。

当您想要重载运算符时,引用确实会发挥作用。例如,如果您构造一个自定义数字类型来表示矩阵,则可以创建一个加法运算符,例如

matrix operator + (matrix m1, matrix m2);

但这会导致大量的复制。您可以使用指针:

matrix operator + (matrix* m1, matrix* m2);

但是调用代码会非常难看:

matrix m = &m1 + &m2;

引用允许我们以避免复制的方式编写运算符,并允许我们在调用站点干净地使用它,而无需到达运算符的地址。

总而言之:C++ 中的引用与指针类似,因为它们允许您通过多个变量引用相同的值。然而,与需要使用内存地址的指针不同,引用是一种语法上的便利,其实际实现取决于编译器。

我希望这会有所帮助。

关于c++ - 通过引用和指针传递参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25977467/

相关文章:

c++ - 从 2d char 数组 c++ 将字符串分配给 char 数组

c++ - 使用 boost::locale 进行 Unicode 字符分类

c# - 如何从 C# 中的 .h 文件中读取常量

c++ - 如何存储将被多个不同类访问的字符串常量?

c - 我只能调用一个函数一次来使用指针比较两个数字

vb.net - 'TryAction()' 方法是邪恶的吗?

python - 参数 : passed by reference vs passed by name

c++ - 指针和面向对象编程

c++ - 检查未释放的指针

c# - 我可以有一个接口(interface)参数,通过引用传递吗?