Che cosa significa che un puntatore è un indirizzo? Significa che si riferisce a una posizione di memoria in cui è memorizzato il valore che punta a, in genere una variabile. Quando dici che un puntatore punta a qualcosa , intendi davvero un puntatore che punta a una variabile qualcosa .
Questa variabile può contenere un int, ma può anche contenere un altro puntatore. Quindi, più correttamente, hai un puntatore a una variabile puntatore. Ciò semplifica la spiegazione: è necessario un puntatore a una variabile puntatore per gli stessi motivi per cui è necessario un puntatore a una variabile intera.
Un puntatore a un puntatore non esiste come tipo proprio. Se hai questo:
int **p;
then p
ist è ancora un puntatore a livello singolo. Non leggerlo in questo modo:
int (**)p; // wrong
ma come questo:
(int *) *p; // correct
perché è un puntatore a un'altra variabile puntatore che contiene un puntatore a una variabile int.
int i = 125;
int *p1 = &i;
int **p2 = &p1;
Address Value
0x10000000 [0x20000000] p2
0x20000000 [0x30000000] p1
0x30000000 [125] i
EDIT:
Se trovi ancora questo confuso, non provare a pensare al puntatore all'infinito. Funziona in C semplice, è un comportamento completamente indefinito (e quindi cattivo ) e richiede sizeof(unsigned int) == sizeof(unsigned int *)
. Ma poi funziona con qualsiasi quantità di *
del supporto del compilatore.
unsigned int **********p;
p = (void *)&p;
printf("%x\n", **********p);
printf("%p\n", (void *)p);