按引用调用和按指针调用之间的差异
Diff Between Call By Reference And Call By Pointer
有人能告诉我指针调用和引用调用之间的确切区别吗。事实上,这两起案件都发生了什么?
例如:
参考呼叫:
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。使用指针的优点是可以操作地址本身。有时你需要修改地址(把它指向其他东西…)这是指针不同的时候;指针允许您直接处理地址,引用不会
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 当使用通配符和null指针调用函数时,对输出的说明
- 使用共享指针的函数调用,其对象应为 const
- 如何调用指针类型的方法(禁用多态性)?
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 正确的方法是什么?调用指针到指针到指针内部的函数?
- 参数的混合值,当我调用指针成员函数时
- 调用指针时违反 C++ Typedef 访问冲突
- 调用指针参数从const函数指向的对象的操作员
- 为什么调用指针后给出错误的值
- 正在调用指针和引用方法
- 从c++线程调用指针
- 如何在c++中调用指针成员变量的构造
- Fortran调用c++指针函数
- 递归中修改调用指针的问题
- 如何在类定义中调用指针成员函数
- 在矢量中调用指针函数的方法
- 在类中调用指针函数
- 调用指针到成员函数
- 如何使用QtConcurrent::run调用指针作为参数的非类成员函数