2014-09-22 61 views
2

我来自C,并且我已经了解到,如果我们将一个参数传递给一个函数,它只会使用它的值来复制它,所以如果我们改变这个变量值,那么变量传递给函数的内容不会改变,因为它们显然是2个不同的变量,只有2个不同的地址具有相同的值。 所以在C中,如果我们想要改变传递给函数的参数,我们会传递一个带参数地址的指针。现在通过引用和指针传递参数

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

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

不仅如此,我们还没有取消引用分配一个值,但是,当我们传递变量到函数我们按原样传递它(&)运算符。 所以我不明白这里有什么区别? 如果我们不去引用它甚至是一个指针?另外,如果我们按照原样传递它,那么我们是如何通过引用来传递的呢? 有人可以帮我清理一些东西吗?

+0

与什么有什么不同?函数签名表示参数是通过引用传递的,所以它是。 – juanchopanza 2014-09-22 15:14:15

+1

这个线程有帮助吗? http://stackoverflow.com/questions/410593/pass-by-reference-value-in-c – taocp 2014-09-22 15:14:44

+0

简单的答案是'C'只有传递值,而C++有传递值和传递-引用。所以你应该学习后者,因为这个概念在'C'中不存在。此外,试图通过使用'C'作为指导来学习C++ - 这可能适用于某些事情,但是如果这个概念根本不存在于'C'中(例如传递引用),那么,就像现在的情况一样,我会感到困惑。 – PaulMcKenzie 2014-09-22 15:26:03

回答

3

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

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

当您想要重载操作符时,参考文献真的很闪亮。例如,如果你建立一个自定义的数字类型来表示一个矩阵,你可以创建一个加法运算符,如

matrix operator + (matrix m1, matrix m2); 

但是,这会招致很多复制。您可以使用指针:

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

但随后调用的代码将是非常难看:

matrix m = &m1 + &m2; 

引用允许我们写出以避免复制的方式操作,并可以让我们清晰地使用它在呼叫地点没有到达运营商的地址。

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

我希望这会有所帮助。

+0

基本上函数中的变量具有与传递给该函数的变量相同的地址,但它不是一个指针吗?只有2个共享相同地址的变量? @bstamour – 2014-09-22 15:32:12

+0

你可以这样想,是的。如果你想使用指针来减轻你的理解,一个引用是一个常量指针(即不能改变指向别处的指针)。 – bstamour 2014-09-23 12:44:05