Przykłady z here.
Kod Główny:
#include <stdio.h>
int a;
int main() {
a = 3;
f(4, &a);
printf("%d\n", a);
return 0;
}
Połącz przez. Wartość:
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but now nothing is done with x anymore
a += 2*y;
// a is still 3 so the result is 11
}
wartość jest przekazywana i nie ma wpływu na wartość zmiennej przekazanej w
połączeń według pozycji:
f(int x, int &y){
// x will be 3 as passed argument
x += a;
// now a is added to x so x will be 6
// but because & is used x is the same as a
// meaning if you change x it will change a
a += 2*y;
// a is now 6 so the result is 14
}
Referencja jest przekazywana. Skutecznie zmienna w funkcji jest taka sama, jak ta na zewnątrz.
połączeń z Kopiuj/Restore:
int a;
void unsafe(int x) {
x= 2; //a is still 1
a= 0; //a is now 0
}//function ends so the value of x is now stored in a -> value of a is now 2
int main() {
a= 1;
unsafe(a); //when this ends the value of a will be 2
printf("%d\n", a); //prints 2
}
wartość jest przekazywana i nie ma wpływu na wartość zmiennej przekazanej w do końca funkcji, w tym momencie wartość końcowa zmienna funkcyjna jest przechowywana w zmiennej przekazanej.
Podstawowa różnica między wywołaniem przez odniesienie i kopiowaniem/przywracaniem polega na tym, że zmiany dokonane w zmiennej funkcji nie pojawią się w przekazanej zmiennej, dopóki po zakończeniu funkcji nie zostaną wyświetlone zmiany wywołania przez odniesienie.
Chociaż byłem w stanie zaakceptować twoją odpowiedź, musiałem czekać jeszcze kilka godzin, aby móc nagrodzić nagrodę. Dzięki za wspaniałą odpowiedź, a nagroda jest oczywiście Twoja! – mort
Ah, nie wiedziałem o systemie nagród. Dobrze wiedzieć! – mydogisbox