Si, ma più correttamente si dice "puntatori che a sua volta puntano a puntatori".
Esempio:
char** a;
a è un doppio puntatore, e il compilatore sa che a contiene un indirizzo che punta a un altro indirizzo che a sua volta punta a un'altra zona di memoria che contiene un char.
B è un doppio puntatore, e fin qui ci siamo.codice:char **B = &A ; char * E [5] ; E[0] = *B ;
Strano a dirlo (non tanto però), anche E è un doppio puntatore, perché sappiamo che un array in C non è altro che un puntatore al primo elemento dell'array.
Solo che c'è una piccola ma sostanziale differenza tra queste due dichiarazioni:
char **B;
char * E [5] ;
La prima semplicemente dichiara un doppio puntatore, mentre la seconda alloca sullo stack 5 puntatori a char. Proprio per il fatto che alloca anche sullo stack, la seconda dichiarazione non è molto indicata quando dovrai allocare memoria dinamicamente (per esempio con malloc())
Spero di essertti stato utile

