![Very Happy :D](./images/smilies/icon_biggrin.gif)
![arrow :arrow:](./images/smilies/icon_arrow.gif)
- 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;
}
![arrow :arrow:](./images/smilies/icon_arrow.gif)
- 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).
![arrow :arrow:](./images/smilies/icon_arrow.gif)
È 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
![Wink ;)](./images/smilies/icon_wink.gif)
spero di non aver scritto cavolate!
enjoy