per valore: è quello usato di default dal linguaggio. In questo caso dei parametri originari la funzione riceve solo una copia e di conseguenza qualsiasi modifica sui parametri all'interno della funzione non si ripercuoterà sugli stessi. Esempio:
- Codice: Seleziona tutto
int main()
{
int a = 7;
int b = 6;
int risultato;
result = times(a,b);
cout << the result is: < result << '\n';
return 0;
}
int times (int x, int y)
{
return x * y;
}
per indirizzo: è utile se si vuole permettere la modifica dei parametri forniti ad una funzione alla quale viene passato non una copia della variabile (come nel caso precedente) ma il suo indirizzo di memoria, consentendo così dentro alla funzione un suo accesso diretto. Esempio:
- Codice: Seleziona tutto
int main()
{
int a = 7;
int b = 6;
int risultato;
result = times(&a, &b);
cout << the result is: < result << '\n';
return 0;
}
int times (int *x, int *y)
{
return (*x) * (*y);
}
in questo caso passiamo l'indirizzo (operatore &) delle variabili "a" e "b", in modo che eventualmente all'interno della funzione siano modificabili. Ciò avviene attraverso l'operatore *: "*x" identifica dunque il contenuto della cella di memoria di cui "x" contiene l'indirizzo. "x" è quindi dentro la funzione a tutti gli effetti un puntatore che contiene l'indirizzo di memoria della variabile "a" dichiarata all'interno del main.
Da ciò, se la variabile "a" fosse stata dichiarata dall'inizio come un puntatore, ad esempio:
- Codice: Seleziona tutto
int* a = &p;
("a" contiene l'indirizzo di memoria di "p") e vogliamo passare il contenuto di "p" (modificabile, non la copia) ad una funzione, possiamo farlo in due modi equivalenti. Passando l'indirizzo di "p":
- Codice: Seleziona tutto
int main()
{
int p = 10;
int* a = &p;
funzione (&p)
}
void funzione (int* p)
{
*p = 17;
}
oppure passando direttamente il puntatore contenente l'indirizzo di "p":
- Codice: Seleziona tutto
int main()
{
int p = 10;
int* a = &p;
funzione (a)
}
void funzione (int* p)
{
*p = 17;
}
il tutto in modo trasparente alla funzione: da notare infatti che nella dichiarazione della funziona va indicato che si accetta un puntatore, contenente l'indirizzo della variabile. Questo puntatore può essere esplicito (secondo caso) oppure ricavato mediante l'operatore & sulla variabile stessa (primo caso).
per riferimento: questa è la cosa per cui scrivo sta guida. In effetti a ben vedere nell'esempio precedente se vogliamo all'interno di "funzione" è possibile ("*p = 17;") modificare la cella di memoria indirizzata dal puntatore "p" ma se volessimo invece modificare direttamente "p", magari per farla puntare ad un'altra locazione, sarebbe impossibile con il metodo prima esposto. Infatti il puntatore "p" viene passato sempre per valore: non ho nessuna conoscenza, dentro "funzione", della sua posizione in memoria per poterlo modificare; un eventuale cambiamento (ad esempio "p = 32") andrebbe immediatamente perso all'uscita della funzione perché si sta lavorando su una copia del puntatore "a" dichiarato ed inizializzato nel main.
È tuttavia possibile effettuare un indirizzamento per riferimento, che ci consente di modificare sia "p" (quindi l'indirizzo cella di memoria a cui esso punta) sia il contenuto della cella di memoria:
- Codice: Seleziona tutto
int main()
{
int p = 10;
int* a = &p;
funzione (a)
}
void funzione (int*& p)
{
*p = 17;
p = 0x873dc28;
}
Nulla cambia nell'istruzione di richiamo della funzione, ma qualcosa cambia nella dichiarazione della stessa: "*&" in luogo della sola "*". Ciò ci indica che oltre al contenuto della cella di memoria riferita dal puntatore (che modifichiamo con successo mediante l'istruzione "*p = 17;"), abbiamo a disposizione anche il puntatore stesso (che, dopo aver modificato la variabile da lui indirizzata, faremo indirizzare un altra cella di memoria alla posizione "0x873dc28"). A differenza del caso precedente (passaggio di parametri per indirizzo), anche questa ultima istruzione ora, con il passaggio per riferimento, ha successo.
sto facendo un esempio piuttosto istruttivo quando avrò finito posto
spero di non aver scritto cavolate!
enjoy