Funzioni: puntatori e reference

BoG3
Ciao a tutti, vorrei chiedervi la differenza tra queste due sintassi:

void minmax (int a1, int a2, int a3, int *pmin, int *pmax){..}

che viene richiamata con
minmax(a,b,c, &min, &max);


e

void minmax (int a1, int a2, int a3, int &pmin, int &pmax){..}

che viene richiamata con
minmax(a,b,c, min, max);


Se non sbaglio, nel primo caso, io invocando la funzione gli passo un indirizzo, per esattezza l'indirizzo delle variabili min e max e le vado a mettere, nella funzione, nei puntatori *pmin, *pmax.

Nella seconda invece, io passo due variabili (non piu' indirizzi di variabili ma valori contenuti dentro le variabili) e le metto in &pmin, &pmax che non sono dei puntatori. Al meno pmin e pmax non lo sono. L'operarore reference: & messo davanti ad una variabile mi restituisce il suo indirizzo in memoria, no ? quindi, se nella chiamata alla funzione, la variabile min avesse contenuto il valore 4, allora io avrei messo 4 nell'indirizzo di memoria puntato da &pmin. no ? la differenza? che il primo salva le modifiche fatte nella funzione, il secondo no ... gisuto?

Grazie mille.

Risposte
BoG3
[Ho editato il testo sbarrato]
Ok, forse ci sono:

in questo caso:
void minmax (int *pmin, int *pmax){..}

minmax(&min, &max);

succede questo:
richiamando la funzione minmax gli dico: "hei, prendi l'indirizzo in memoria della variabile min" e lo faccio aggiungendo & davanti a min. Ora, che hai preso il suo indirizzo di memoria, [strike]mettilo nel puntatore pmin. quindi pmin e min puntano alla stessa zona di memoria quindi le operazioni fatte nella funzione vengono salvate.[/strike] mettilo in *pmin, ossia: vai nella locazione di memoria puntata da *pmin, dentro inserisci l'indirizzo di memoria di min. A questo punto tutte le modifiche fatte su *pmin non veranno riportate su min perchè invece di lavorare sul valore di min (ad esempio: 5) vai a modificare un valore che è uguale a quello del suo indirizzo in memoria (ad esempio:2587854).
lo stesso discorso vale per max e pmax

Nel secondo caso:
void minmax (int &pmin, int &pmax){..}

minmax(min, max);

succede questo:
richiamando la funzione minmax gli dico: prendi il valore di min (non piu' l'indirizzo di memoria della variabile ma cio' che ci sta dentro) e mettilo in &pmin ma &pmin significa "l'indirizzo in memoria di pmin" quindi ottengo l'indirizzo in memoria di pmin e vado a scrivere dentro il valore della variabile min. giusto? è come dire
*pmin = min
?? [strike]In questo caso, pero', le modifiche aportate ai valori passati non vengono salvate. Giusto?[/strike] In questo caso, non mi è molto chiaro cio' che accade..

claudio862
Questo è un puntatore:
int * a;


Questo è un riferimento:
int & a;


I riferimenti (che esistono in C++ ma non in C) sono molto simili ai puntatori. Le differenze principali sono che non possono essere lasciati non inizializzati, non possono venire riassegnati, non gli puoi assegnare un valore nullo (NULL o 0 che sia).
Nel tuo esempio sono completamente equivalenti. In generale, se puoi scegliere tra puntatori e riferimenti scegli sempre i secondi.

http://stackoverflow.com/questions/5748 ... iable-in-c

BoG3
ciao, ho letto il link che hai aggiunto nel post. è molto interessante ma ho ancora una cosa che non capisco: cosa accade esattamente quando io do l'istruzione
int vecchio_numero = 0; 
int &numero = vecchio_numero;

claudio862
"BoG":
ciao, ho letto il link che hai aggiunto nel post. è molto interessante ma ho ancora una cosa che non capisco: cosa accade esattamente quando io do l'istruzione
int vecchio_numero = 0; 
int &numero = vecchio_numero;


In pratica stai creando un "sinonimo" per vecchio_numero. Qualsiasi modifica o assegnamento fai su numero si ripercuote su vecchio_numero. Come usando un puntatore, ma senza usare esplicitamente gli operatori & e *.

BoG3
Ciao, grazie, penso di esserci arrivato.
Il problema era che ho sempre visto fare
int *a= &b;
e mai
int &a = b
e siccome so che mettendo il & davanti a una variabile ne ottieni il suo indirizzo in memoria. quindi mi sono detto:
int &a = b
con &a ottengo l'indirizzo della cella di memoria dove è memorizzato a e poi vado ad assegnare all'indirizzo, sovrascrivendolo, il valore in b, quindi, il mio indirizzo di memoria che da 0028FA passa ad esempio a 13. :) capite quale era il mio dilema ?
In pratica scrivere &a coincide con *a?

claudio862
"BoG":
Ciao, grazie, penso di esserci arrivato.
Il problema era che ho sempre visto fare
int *a= &b;
e mai
int &a = b
e siccome so che mettendo il & davanti a una variabile ne ottieni il suo indirizzo in memoria.

Sì, ma non in una dichiarazione. In una dichiarazione il simbolo & indica semplicemente che la variabile è un riferimento (in C++, in C è un errore). Niente a che vedere con indirizzi di memoria.

"BoG":
quindi mi sono detto:
int &a = b
con &a ottengo l'indirizzo della cella di memoria dove è memorizzato a

No. con "int & a" stai solo dichiarando una variabile di tipo riferimento a int.

"BoG":
In pratica scrivere &a coincide con *a?

No. "int & a" dichiara un riferimento a int, "int * a" dichiara un puntatore a int.

BoG3
grazie mille. ho capito!
Molto gentile.

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