通过引用和指针传递参数

时间:2014-09-22 15:11:53

标签: c++ pointers pass-by-reference

我来自C,我已经了解到,如果我们将一个参数传递给一个函数,它只会用它的值复制它,所以如果我们改变这个变量值传递给函数的变量不会发生变化,因为它们显然是2个不同的变量,2个不同的地址只有相同的值。 所以在C中,如果我们想要更改传递给函数的参数,我们将传递一个带有参数地址的指针。

现在,在c ++中我们也可以这样做,但我们也可以这样做:

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

我们不仅没有取消引用来分配值,而且当我们将变量传递给函数时,我们按原样传递它而没有地址(&)运算符。 所以我不明白这里的区别是什么? 如果我们不引用它甚至是一个指针?如果我们按原样通过它而没有&运算符如何通过引用传递它? 有人可以为我清理一些事情吗?

1 个答案:

答案 0 :(得分:3)

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

引用可以由编译器实现为指针,但不需要。

当您想要重载运算符时,引用真的很闪耀。例如,如果构造自定义数字类型来表示矩阵,则可以创建一个加法运算符,例如

matrix operator + (matrix m1, matrix m2);

但这会导致很多复制。你可以使用指针:

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

然后调用代码会非常难看:

matrix m = &m1 + &m2;

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

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

我希望这会有所帮助。