任何人都能告诉我指针调用和引用调用之间的确切差异。实际上两种情况都发生了什么?
例如:
按参考号召集:
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);
答案 0 :(得分:17)
这两种情况完全相同。
然而,差别很小,引用永远不会为空(并且你确定内部函数是引用有效变量)。另一方面,指针可能为空或可能指向内存中的无效位置,从而导致AV。
答案 1 :(得分:3)
从语义上讲,这些调用具有相同的结果;引擎盖引用是用指针实现的。
使用引用和指针之间的重要区别在于引用你的绳索很少。引用总是指向“某事”,指针可以指向任何东西。例如,完全可以做这样的事情
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;
}
现在这段代码可以做任何事情,崩溃,跑步,让猴子飞出你的任何东西。
如有疑问,请更喜欢参考文献。它们是指针上更高,更安全的抽象层次。
答案 2 :(得分:0)
在您的示例中,没有区别。
在C ++中,引用是使用指针实现的。
编辑:对于那些认为引用不能为NULL的人:
int calc(int &arg)
{
return arg;
}
int test(int *arg)
{
return calc(*arg);
}
猜猜,test(0)
的结果是什么?
答案 3 :(得分:0)
您的代码是C ++代码。在Java中没有指针。两个例子都做同样的事情,功能上没有区别。
答案 4 :(得分:0)
我不知道为什么这个被标记为jave,因为没有指针。但是,对于该概念,如果您正在处理value属性,则可以交替使用指针和引用。例如,i = 4或* i = 4。使用指针的优点是你可以操纵地址本身。有时您需要修改地址(将其指向其他地方......)这是指针不同以供参考;指针允许您直接在地址上工作,参考不会