C/C++ - Reference e puntatori

BoG3
Ciao a tutti, ho una domanda:
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
hyoukarou
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:

#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 :snakeman:

BoG3
Ciao, scusami ma non riesco a capire sta cosa!
int a = 1;
cout << a;


mi dovrebbe dare 1

cout << &a;


mi dovrebbe dare uyn quacosa tipo
0xbf8a4d5c 
no?

E se io faccio
int a=1;
int &b=a;
cosa succede? cosa fa esattamente quest istruzione?

claudio862
"BoG":
E se io faccio
int 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).

BoG3
Quindi ...
int a=1;;
int b = &a;

sarebbe come
int a = 1;
int *b = a;
?

vict85
È equivalente a
int a = 1;
int * const b = a;

anche se penso che il C++ consideri i due tipi come distinti. Ma sono sottigliezze.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.