值参数和参考参数之间的差异?在我的采访中,访谈员有时会问这个问题。有人可以告诉我一个容易用例子解释的确切区别吗?并且参考参数和指针参数是一样的吗?
由于
答案 0 :(得分:14)
调用者看不到对值参数的更改(也称为“按值传递”)。
调用者可以看到对参考参数的更改(“按引用传递”)。
C ++示例:
void by_value(int n) { n = 42; }
void by_ref(int& n) { n = 42; }
void also_value(int const& n); // Even though a reference is used, this is
// semantically a value parameter---though there are implementation
// artifacts, like not being able to write "n = 42" (it's const) and object
// identity (&n here has different ramifications than for by_value above).
指针的一个用途是实现“引用”参数,而不使用特殊的引用概念,某些语言(如C)没有。 (当然,您也可以将指针视为值本身。)
答案 1 :(得分:8)
主要区别在于是否复制了传递的对象。如果它是一个值参数,编译器必须生成这样的代码,改变函数内部的函数参数对传递的原始对象没有影响,因此它通常会复制该对象。在参考参数的情况下,编译器必须生成这样的代码,所有操作都在传递的原始对象上完成。
答案 2 :(得分:2)
指针是表示引用的低级方式,因此传递指针(按值)是C语言通常如何通过引用语义实现传递。
答案 3 :(得分:2)
我认为此链接可能会对您有所帮助Call by Value and Call by Reference。这家伙详细解释了它是如何工作的。希望能说清楚。
答案 4 :(得分:2)
区别很简单:直接参数按值传递,接收器接收传递的副本;意味着如果接收器修改了参数,这些更改将不会反映回调用者。 (这通常被称为,足够适当,通过价值或通过复制。
答案 5 :(得分:1)
基本上有三种参数;指针,参考和直接。
区别很简单:直接参数按值传递,接收器接收传递的副本;意味着如果接收器修改了参数,这些更改将不会反映回调用者。 (这通常被称为,足够恰当,按值传递,或bycopy
。
指针也按值传递,但调用者不是发送实际值,而是发送值的地址。这意味着通过遵循此指针,接收器可以修改参数。请注意,对实际指针所做的更改仍然不会反映回调用方。
最终形式,逐个引用,是这两种方法之间的中间立场。从本质上讲,它可以被认为是一个看起来像值的指针。
值得一提的是,在这一切的核心,参数始终通过值传递,但不同的语言有不同的方式来实现引用语义(请参阅Kylotans答案)。
// Example using C
// bycopy
int multiply(int x, int y) {
return x * y;
}
void multiply_p(int *x, int y) {
*x *= y;
}
int main () {
int i, j, k;
i = 20;
j = 10;
k = multiply(i,j); // k is now 200
multiply_p(&i, k); // i is now 4000 (200 * 20)
return 0;
}
答案 6 :(得分:0)
伪代码:
通过价值:
void setTo4(value) { // value is passed by value
value = 4;
}
int x = 1;
setTo4(x);
// x is still 1
通过参考:
void setTo4(value) { // value is passed by reference
value = 4;
}
int x = 1;
setTo4(x);
// x is 4