puoi anche creare il puntatore del puntatore del puntatore se hai fegato
Ti suggerisco come interessante esercizio l'allocazione dinamica della memoria per una matrice tridimensionale gestita come puntatore triplo 
Comunque eseguendo queste righe di codice
codice:
int **a,b=5,c=4;
*a=&b;
**a=&c;
potrebbe verificarsi un segfault perché non c'è spazio allocato né per *a né per **a, quindi entrambe le assegnazioni possono generare un errore di accesso alla memoria.
Propongo un esempio forse più sensato:
codice:
#include <stdio.h>
int main(void)
{
int **a = NULL, *b = NULL, c = 4;
a = &b;
b = &c;
printf("Variabile a\nIndirizzo: %p\nContenuto: %p\n\n", (void *) &a, (void *) a);
printf("Variabile b\nIndirizzo: %p\nContenuto: %p\n\n", (void *) &b, (void *) b);
printf("Variabile c\nIndirizzo: %p\nContenuto: %d\n\n", (void *) &c, c);
return 0;
}
Che può dare come possibile output:
codice:
Variabile a
Indirizzo: 0xbfd5a21c
Contenuto: 0xbfd5a218
Variabile b
Indirizzo: 0xbfd5a218
Contenuto: 0xbfd5a214
Variabile c
Indirizzo: 0xbfd5a214
Contenuto: 4
In sostanza in memoria c'è questa situazione
codice:
Variabile a Variabile b Variabile c
+---------------------+ +---------------------+ +---------------------+
|Indirizzo: 0xbfd5a21c| -------> |Indirizzo: 0xbfd5a218| -------> |Indirizzo: 0xbfd5a214|
|Contenuto: 0xbfd5a218| |Contenuto: 0xbfd5a214| |Contenuto: 4 |
+---------------------+ +---------------------+ +---------------------+