Spulciando tra i miei appunti di Programmazione (copia/incolla dal file .doc del 2003!):

Dati:
unsigned x = 5, *myPointer = &x;

L'indirizzo di memoria di x è esprimibile in questi modi:
printf("\n%X", &x);
printf("\n%X", myPointer);
printf("\n%X", *&myPointer);
printf("\n%X", &*myPointer);

Il valore di x si esprime cosi:
printf("\n%d", x);
printf("\n%d", *myPointer);

Così si modifica x:
x = y;
*myPointer = y;


Che significato ha l’espressione **myPointer?
Nessuno. *punt esprime il valore memorizzato all’indirizzo puntato. Applicare una indirezione a tale valore non ha senso perchè il contenuto di x non è un indirizzo.

E l’espressione *x?
La risposta è uguale alla precedente. Scrivere *x comporta lo stesso errore che scrivere **punt.
Il contenuto di x non è un indirizzo.

Cosa restituisce &&x?
Restituisce un errore in compilazione. Infatti &x rappresenza l’indirizzo, ma che senso ha parlare dell’indirizzo di un indirizzo?

E l’espressione &&punt?
Anche questa è un’espressione incorretta. Un puntatore è sempre una variabile, quindi il discorso è lo stesso appena fatto per &&x.

Cosa accade se si esegue punt=0x24A6?
Si assegna un nuovo indirizzo di memoria a *punt, il quale ora punterà a ciò che si trova a quell’indirizzo e non più a x.

E se si esegue &punt = 0xAF2B?
Si ottiene un errore. Infatti l’indirizzo di punt non può essere modificato a mano, in quanto stabilito dal compilatore. E’ possibile solo stabilire a quale indirizzo punta.