按引用调用和按指针调用之间的差异

Diff Between Call By Reference And Call By Pointer

本文关键字:调用 指针 引用 之间      更新时间:2023-10-16

有人能告诉我指针调用和引用调用之间的确切区别吗。事实上,这两起案件都发生了什么?

例如:

参考呼叫:

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);

这两种情况的作用完全相同。

然而,小的区别是,引用从来都不是null(在函数内部,你可以肯定,它们引用的是有效的变量)。另一方面,指针可能是空的,或者可能指向内存中的无效位置,从而导致AV。

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

使用引用和指针之间的重要区别在于,使用引用时,你可以用的绳索要少得多。引用总是指向"某物",在那里作为指针可以指向任何东西。例如,完全有可能做这样的

 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;
 }

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

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

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

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

编辑:对于那些认为引用不能为空的人:

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

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

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

我不知道为什么它被标记为jave,因为没有指针。但是,对于这个概念,如果您正在处理value属性,则可以互换使用指针和引用。例如i=4或*i=4。使用指针的优点是可以操作地址本身。有时你需要修改地址(把它指向其他东西…)这是指针不同的时候;指针允许您直接处理地址,引用不会