参照渡しと値渡しの意味について次の記事を読みました: http://qntm.org/call
だから私が正しく理解していることを確認するために...それは、関数の値による呼び出しは元の入力を変更せず、その入力のローカルコピーのみを変更することを意味しますか? ただし、Java と Python では、値は実際には値への参照であるため、関数内で値によって呼び出すと、元の入力が変更されるということですか?
参照渡しと値渡しの意味について次の記事を読みました: http://qntm.org/call
だから私が正しく理解していることを確認するために...それは、関数の値による呼び出しは元の入力を変更せず、その入力のローカルコピーのみを変更することを意味しますか? ただし、Java と Python では、値は実際には値への参照であるため、関数内で値によって呼び出すと、元の入力が変更されるということですか?
入力が正確に何を意味するかによって異なります。具体的には、呼び出しサイトで引数として表示される変数を意味するかどうかによって異なります。たとえば、次のようx
になります。
Object x = ...;
someMethod( x );
または、呼び出された関数が参照する実際のオブジェクトについて話しています。たとえば、実際の Object インスタンスは次のとおりです。
someMethod( new Object() );
変数の値(変数が参照するオブジェクト) は変わりませんが、取得したオブジェクトに対して何かを行うことはできます。例えば、
void appendX( StringBuilder sb ) {
sb.append('x');
}
void foo() {
StringBuilder builder = ...
appendX( builder );
builder.toString(); // will contain 'x' because you worked with the object that
// is the value of the variable `builder`. When appendX was
// was invoked, the value of its variable `sb` was the same
// object that is the value of foo's `builder`. Without
// changing what value the variable `builder` refers to, we
// did "change" the object (i.e., we appended 'x').
}
ただし、メソッド内の参照を更新しても、メソッド外の参照は変更されません。メソッド内から、メソッドのパラメーターの 1 つに割り当てることによって、メソッド外の変数が参照するオブジェクトを変更することはできません。例えば:
void setNull( StringBuilder sb ) {
sb = null;
}
void foo() {
StringBuilder builder = ...
appendX( builder );
builder == null; // false, because the value of the variable `builder` is still the
// same object that it was before. Setting variable `sb` in setNull
// to null doesn't affect the variable `builder`. The variables are
// just a name so that you can refer to an value. The only way to
// what value a variable refers to is with an assignment.
}
Java には、int、long、float、double、および参照という基本的な型の変数がいくつかあります。参照とは、通常、文字列などのオブジェクトとして参照するものです。ただし、参照変数に実際に格納されるのは、オブジェクト自体ではなく、実際のオブジェクトがメモリ内にある場所へのアドレスです。
これは Java では見られませString str = "hello"
んstr
。しかし実際にstr
は、実際の文字列「hello」が格納されている場所への番号 (メモリ アドレス) が含まれています。
Java でメソッドを呼び出すと、そのパラメーターがコピーされます (値渡し)。これは、文字列などのオブジェクトにも当てはまります。ただし、実際のオブジェクトはコピーされず、参照のみがコピーされます。ただし、参照はコピーされない何か (メモリ内の実際のオブジェクトの場所) を指しているため、参照を使用して、関数の外であっても実際のオブジェクトを変更できます。
C では、ポインターを使用して実際に参照渡しを行うことができます。
void changeA(int* a) {
*a = 5
}
int main(void) {
a = 10;
changeA(&a); // pass by reference - &a means "address of a", similar to a reference in java
printf("a: %d\n", a); // prints "5"
}