Ποια είναι η διαφορά μεταξύ
Μπορείτε να μου δώσετε μερικά παραδείγματα, παρακαλώ;
Είναι ένας τρόπος για να περνάτε ορίσματα σε συναρτήσεις. Το πέρασμα μέσω αναφοράς σημαίνει ότι η παράμετρος που καλείται από τις συναρτήσεις θα είναι η ίδια με το όρισμα που έχει περάσει ο καλούντας (όχι η τιμή, αλλά η ταυτότητα - η ίδια η μεταβλητή). Πέρασμα με τιμή σημαίνει ότι η παράμετρος των καλούμενων συναρτήσεων' θα είναι ένα αντίγραφο του καλούντος' περασμένου ορίσματος. Η τιμή θα είναι η ίδια, αλλά η ταυτότητα - η μεταβλητή - είναι διαφορετική. Έτσι, οι αλλαγές σε μια παράμετρο που γίνονται από την καλούμενη συνάρτηση στη μία περίπτωση αλλάζουν το όρισμα που έχει περάσει και στην άλλη περίπτωση απλά αλλάζει η τιμή της παραμέτρου στην καλούμενη συνάρτηση (η οποία είναι μόνο ένα αντίγραφο). Σε μια γρήγορη βιασύνη:
ref
χρησιμοποιείται στον καλούντα και στην καλούμενη συνάρτηση). Ο Jon Skeet έχει επίσης μια ωραία εξήγηση για αυτό εδώ.Κώδικες
Δεδομένου ότι η γλώσσα μου είναι η 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;
}
}
Wikipedia
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_value
http://en.wikipedia.org/wiki/Pass_by_reference#Call_by_reference
Αυτός ο τύπος είναι λίγο πολύ καρφιά:
Ακολουθεί ένα παράδειγμα: