C/C++ - Reference e puntatori
Ciao a tutti, ho una domanda:
Se ho questo sorgente:
Non capisco se a e b hanno salvato le modifiche dopo la f.
Io ho pensato:
f(a, b) passa i valori (1, 2) e li mette nell'indirizzo di memoria di x e y. Ma x e y vivono in f e vi muoiono. Io non ho mica passato l'indirizzo di memoria dove sono salvati 1 e 2! Ho passato una copia dei vlaori.
Ho sbaglaito?
Come funziona in realta' ? grazie mille
Se ho questo sorgente:
void f(int &x, &y){ x*=2; y*=3; } void main v(void){ int a=1; int b=2; f(a,b); cout << a << b; }
Non capisco se a e b hanno salvato le modifiche dopo la f.
Io ho pensato:
f(a, b) passa i valori (1, 2) e li mette nell'indirizzo di memoria di x e y. Ma x e y vivono in f e vi muoiono. Io non ho mica passato l'indirizzo di memoria dove sono salvati 1 e 2! Ho passato una copia dei vlaori.
Ho sbaglaito?
Come funziona in realta' ? grazie mille
Risposte
Nein nein nein, stai passando i due valori by reference(ricorda che i reference sono implementati come puntatori) perciò non "vivono e muoiono in f" e non hai passato una copia dei valori bensì il loro indirizzo.
Il codice ha un bel po' di errori che puoi intuire confrontanto con questa versione:
ideone! per l'output.
Se vuoi passare i valori by value devi sostituire il prototipo di f con:
Riassumento, i reference sono dei puntatori speciali
Il codice ha un bel po' di errori che puoi intuire confrontanto con questa versione:
#include <iostream> using namespace std; void f(int &x, int &y){ x*=2; y*=3; } int main() { int a=1; int b=2; f(a,b); cout << a << b; return 0; }
ideone! per l'output.
Se vuoi passare i valori by value devi sostituire il prototipo di f con:
void f(int x, int y)
Riassumento, i reference sono dei puntatori speciali

Ciao, scusami ma non riesco a capire sta cosa!
mi dovrebbe dare 1
mi dovrebbe dare uyn quacosa tipo
E se io faccio
int a = 1; cout << a;
mi dovrebbe dare 1
cout << &a;
mi dovrebbe dare uyn quacosa tipo
0xbf8a4d5cno?
E se io faccio
int a=1; int &b=a;cosa succede? cosa fa esattamente quest istruzione?
"BoG":
E se io faccioint a=1; int &b=a;cosa succede? cosa fa esattamente quest istruzione?
Crea un nuovo riferimento alla variabile a. Più o meno è come creare un nuovo nome per quella variabile. Adesso tutte le modifiche fatte ad a si ripercuotono su b, e viceversa. Quindi quando hai una funzione che accetta un riferimento, tutte le modifiche fatte a quel riferimento si ripercuotono sulla variabile originale. Un po' come un puntatore, ma senza dover esplicitamente usare gli operatori & e *.
Nella dichiarazione di una variabile, il simbolo & indica che si vuole creare un riferimento (es "int &" è un riferimento a un int, "std::string &" è un riferimento a un std::string…). Questo non ha assolutamente nessun legame con l'operatore unario & in un'espressione, dove, data una variabile a, "& a" restituisce l'indirizzo di a. Purtroppo si usa lo stesso simbolo per cose diverse (anzi, il simbolo & è usato anche come operatore binario per l'and bit a bit).
Quindi ...
sarebbe come
int a=1;; int b = &a;
sarebbe come
int a = 1; int *b = a;?
È equivalente a
anche se penso che il C++ consideri i due tipi come distinti. Ma sono sottigliezze.
int a = 1; int * const b = a;
anche se penso che il C++ consideri i due tipi come distinti. Ma sono sottigliezze.