Anzitutto chiariamo definiamo meglio il concetto di variabile.
Quando dico
int a = 10 il compilatore associa alla lettera "a" il valore 10, e se lo salva in un indirizzo di memoria.
Se io dico:
int b = a il compilatore crea un nuovo spazio di memoria dove si salva b e gli associa il valore di a.
Se io dico:
a=20 cambia solo il valore associato ad a, è vero che io avevo detto che b è uguale ad a, ma sono due variabili differenti.
Quando io creo una funzione con parametri avviene la stessa cosa:
Codice PHP:
#include <iostream>
using namespace std;
void crescente(int c, int d);
int main()
{
int a, b;
cout << "inserisci il valore di A : ";
cin >> a;
cout << "inserisci il valore di B : ";
cin >> b;
crescente(a,b);
cout << "ordine crescente: " << a << " " << b;
return 0;
}
void crescente(int c,int d)
{
if(c>d)
{
int tmp = c;
c = d;
d = tmp;
}
}
Le variabili
c e
d della funzione
void ordina(int c, int d) sono in uno spazio di memoria differente rispetto quelle dichiarate nel main. Questo vuol dire che lo scambio non avviene.
Se scrivo:
int a = 10; int *punt = &a; si creano sempre due spazi di memoria, ad a è associato 10 mentre a punt viene associato l'indirizzo di a.
Se ora scrivo
*punt = 20; sto dicendo: modificami il valore che contiene quell'indirizzo di memoria (ovvero: modificami il valore di a).
In parole semplici è come dare due nomi alla stessa variabile, se io modifico *punt modifico anche a (e viceversa).
Quindi se riscrivo la funzione scambia in questo modo, funziona:
Codice PHP:
#include <iostream>
using namespace std;
void crescente(int *c, int *d);
int main()
{
int a, b;
cout << "inserisci il valore di A : ";
cin >> a;
cout << "inserisci il valore di B : ";
cin >> b;
crescente(&a,&b);
cout << "ordine crescente: " << a << " " << b;
return 0;
}
void crescente(int *c,int *d)
{
if(c>d)
{
int tmp = *c;
*c = *d;
*d = tmp;
}
}
Con il passaggio by reference a grandi linee avviene la stessa cosa.
Effettivamente su html.it non c'è proprio un buon esempio, il codice lì scritto si potrebbe fare anche senza puntatori, ma per fare una funzione di ordinamento di questo tipo è necessario utilizzare gli indirizzi di memoria; per approfondire meglio leggi le lezioni sui puntatori, sempre su html.it (o su altre guide che trovi).
Capito?