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.
codice:
char **B = &A ;
char * E [5] ;
E[0] = *B ;
B è un doppio puntatore, e fin qui ci siamo.


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