20

谁能告诉我指针调用和引用调用之间的确切区别。实际上这两种情况都发生了什么?

例如:

按参考调用:

void swap(int &x, int &y)
{
   int temp;
   temp = x; /* save the value at address x */
   x = y;    /* put y into x */
   y = temp; /* put x into y */

   return;
}

swap(a, b);

指针调用:

void swap(int *x, int *y)
{
   int temp;
   temp = *x; /* save the value at address x */
   *x = *y; /* put y into x */
   *y = temp; /* put x into y */

   return;
}

  swap(&a, &b);
4

5 回答 5

22

这两种情况完全相同。

但是,小的区别是,引用永远不会为空(并且您确定在函数内部,它们引用的是有效变量)。另一方面,指针可能为空或可能指向内存中的无效位置,从而导致 AV。

于 2013-07-02T10:32:12.937 回答
4

从语义上讲,这些调用具有相同的结果;引擎盖下的引用是用指针实现的。

使用引用和指针之间的重要区别在于,使用引用时,你可以用更少的绳索吊死自己。引用总是指向“某物”,因为指针可以指向任何东西。例如,完全有可能做这样的事情

 void swap(int *x, int *y)
 {
    int temp;
    temp = *x; /* save the value at address x */
    ++x;
    *x = *y; /* put y into x */
    *y = temp; /* put x into y */

    return;
 }

现在这段代码可以做任何事情,崩溃,运行,让猴子从你的鼻子里飞出来,任何事情。

如有疑问,请选择参考。它们是指针上更高、更安全的抽象级别。

于 2013-07-02T10:33:34.007 回答
1

在您的示例中,没有区别。

在 C++ 中,引用是使用指针实现的。

编辑:对于那些认为参考不能为 NULL 的人:

int calc(int &arg)
{
    return arg;
}

int test(int *arg)
{
    return calc(*arg);
}

猜猜,结果会是什么test(0)

于 2013-07-02T10:31:52.533 回答
0

您的代码是 C++ 代码。在 Java 中没有指针。两个例子都做同样的事情,功能上没有区别。

于 2013-07-02T10:34:02.713 回答
0

我不知道为什么这被标记为jave,因为没有指针。但是,对于这个概念,如果您正在处理 value 属性,则可以互换使用指针和引用。例如 i=4 或 *i=4。使用指针的好处是您可以操纵地址本身。有时您需要修改地址(将其指向其他内容......)这是指针不同以供参考的情况;指针允许您直接在地址上工作,引用不会

于 2013-07-02T10:39:12.337 回答