2

可能重复:
C++:何时使用引用与指针

我是 C/C++ 语言的新程序员,由于我来自 C#、Java、JavaScript 和一点 Visual Basic 和 Python 的背景,我很难理解 C++ 中的一些东西.

我已经知道如何使用引用和指针以及它们的真正含义等。但我不明白为什么以及在哪里使用它们。我知道引用有时是这样使用的:

int x = 2;

void Square(int &value)
{
   value = value*value;
}

Square(x);

cout << x << endl;

输出将是 4。

我想我不太明白为什么要那样做而不是这样:

int x = 2;

int Square(int value)
{
   value = value*value;
   return value;
}

x = Square(x);

cout << x << endl;

无论如何,我希望有人能够帮助我理解为什么以及在哪里使用引用和指针。

4

7 回答 7

3

您传递参考有两个主要原因:

  • 更改函数内引用的对象的值
  • 避免复制您传递的对象的成本

如果您想要第二个好处而不是第一个好处,您通常会传递一个const引用以避免错误地更改传递的对象。

在 C++ 中,指针和引用大致相同,但有两个例外:

  • 引用不能指向 0(或nullptr
  • 引用必须始终指向同一个对象

如果你想做这些事情之一,你必须使用一个指针。

此外,指针通常指向通过使用在堆中创建的对象new,而引用通常指向在堆栈中创建的对象。这意味着指针指向的对象的生命周期通常是手动控制的。您必须显式调用delete由创建的对象new才能销毁它们,但是在堆栈中创建的对象的生命周期由运行时自动管理(因此它们的名称为“自动变量”)。

我不知道这是您需要知道的全部内容,还是您正在寻找更具体的内容。

于 2012-04-09T08:24:37.220 回答
1

像这样的示例没有实际区别,但不是将整数传递给 ,而是Square()想象 square 是一个复杂的算法,需要 10 GB 的数据。使用指针不是更好吗,这样参数就不会被复制?

于 2012-04-09T08:25:54.767 回答
0

将参数作为引用传递意味着您将修改它的值(如果您对其进行一些操作)而不是作为它的副本的变量。由于您使用 &value,它会更改存储在 &value 指向的地址的内容。

你需要在 Squre() 中传递 &x 来代替 x。

所以 x= Squre(&x);

或者

广场(&x);

是同样的。

于 2012-04-09T08:23:36.460 回答
0

引用只是变量的伪名称。应用于引用的任何操作实际上都会影响您引用的变量

int a = 5;
int &b = a;
b++; // 'a' gets equal to 6

在您的示例中,您返回乘法的结果,但是如果您需要更改传递给不返回任何内容的函数的变量的值怎么办?

这是参考变得方便的时候。指针的行为方式类似,只是指针不是变量的伪名称,而是它的地址。您可以将指向变量的指针传递给函数,取消引用它,它会以完全相同的方式影响您的变量。

于 2012-04-09T08:24:53.783 回答
0

好吧,对于POD结构,您不会看到很多好处,因为操作=很容易理解。

因此,您x = square(x)的表现非常出色。

当您将对象传递给您的方法时,就会出现使用指针/引用的优势。在这种情况下:

Object x;

Object squre( Object x )
{
    x._internalvalue = x._internalvalue * x._internalvalue;
    return x;
}

x = squre(x);

这里发生的过程完全不同:=符号不会 自动应用于对象,因此您必须实现所谓的三规则,您将在其中找到一个赋值运算符。但是,赋值运算符非常昂贵,因为它必须在内存中重新创建一个新的(临时)对象,调用赋值运算符,然后将该对象的内存复制回原来的x.

此外,将对象作为函数的参数传递将强制处理器复制该对象在堆栈上占用的整个内存,以便在函数中访问它,这是非常昂贵的。

因此,为了回答您的问题,当您开始操作结构和对象时,您会开始看到使用引用和指针的好处,这些结构和对象比普通的旧整数要大得多。

当您操作大对象时,使用引用进行编程将提高性能并限制堆栈溢出的风险。

于 2012-04-09T08:26:53.963 回答
0

第二个示例将在本地复制您的变量x(仅在函数内部可见Square)。

如果您想确保您的全局x保持不变,请这样做。但是,它可能很昂贵(如果您的变量是更大的对象/结构)......并且冗余 - 签出关键字const

于 2012-04-09T08:20:50.187 回答
0

当您想使用另一个名称引用变量时,使用引用。它们具有完全相同的类型、值等。
指针有些不同,它是一种存储地址的新类型。

int i;  
Int &ref = i;  
Int *pointer = &i;  

那么ref和*pointer其实是一回事,i的值。
但是你必须知道,文字“ref”只是“i”(初始化后永远不会改变),而“pointer”只是暂时指向i。
因此,在大多数情况下,它们是相同的。
那么我们什么时候使用引用或指针呢?
在我看来,使用哪个更方便。
例如,一个引用不能改变,但是一个指针指向不同的东西。^_^
啊,我忘了复制的成本,请检查其他的答案。

于 2012-04-09T08:28:36.943 回答