の違いは何ですか?
いくつか例を挙げて教えてください。
参照渡しとは、関数に引数を渡す方法です。参照渡しとは、呼び出された関数のパラメータが、呼び出し側が渡した引数と同じものになることを意味します(値ではなく、同一性、つまり変数そのもの)。値で渡すとは、呼び出された関数のパラメータが、呼び出し側が渡した引数のコピーになるということです。値は同じですが、アイデンティティーである変数は異なります。したがって、呼び出された関数がパラメータを変更すると、ある場合は渡された引数が変更され、別の場合は呼び出された関数のパラメータの値が変更されるだけです(これはコピーに過ぎません)。急いでいます。
ref
は呼び出し側と呼ばれる関数で使われます)。Jon Skeetはこれについてここで素晴らしい説明をしています。コード
私の言語はC++なので、ここではC++を使用します。
// passes a pointer (called reference in java) to an integer
void call_by_value(int *p) { // :1
p = NULL;
}
// passes an integer
void call_by_value(int p) { // :2
p = 42;
}
// passes an integer by reference
void call_by_reference(int & p) { // :3
p = 42;
}
// this is the java style of passing references. NULL is called "null" there.
void call_by_value_special(int *p) { // :4
*p = 10; // changes what p points to ("what p references" in java)
// only changes the value of the parameter, but *not* of
// the argument passed by the caller. thus it's pass-by-value:
p = NULL;
}
int main() {
int value = 10;
int * pointer = &value;
call_by_value(pointer); // :1
assert(pointer == &value); // pointer was copied
call_by_value(value); // :2
assert(value == 10); // value was copied
call_by_reference(value); // :3
assert(value == 42); // value was passed by reference
call_by_value_special(pointer); // :4
// pointer was copied but what pointer references was changed.
assert(value == 10 && pointer == &value);
}
また、Javaでの例も参考にしてください。
class Example {
int value = 0;
// similar to :4 case in the c++ example
static void accept_reference(Example e) { // :1
e.value++; // will change the referenced object
e = null; // will only change the parameter
}
// similar to the :2 case in the c++ example
static void accept_primitive(int v) { // :2
v++; // will only change the parameter
}
public static void main(String... args) {
int value = 0;
Example ref = new Example(); // reference
// note what we pass is the reference, not the object. we can't
// pass objects. The reference is copied (pass-by-value).
accept_reference(ref); // :1
assert ref != null && ref.value == 1;
// the primitive int variable is copied
accept_primitive(value); // :2
assert value == 0;
}
}
ウィキペディア
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference
この人はかなりいいことを言っていますね。
ここではその一例をご紹介します。
#include <iostream>
void by_val(int arg) { arg += 2; }
void by_ref(int&arg) { arg += 2; }
int main()
{
int x = 0;
by_val(x); std::cout << x << std::endl; // prints 0
by_ref(x); std::cout << x << std::endl; // prints 2
int y = 0;
by_ref(y); std::cout << y << std::endl; // prints 2
by_val(y); std::cout << y << std::endl; // prints 2
}