Te conviene mas pensar que los punteros guardan direcciones de memoria, no que guardan otros punteros.
Si piensas que los punteros guardan direcciones de memoria como te propongo, entonces es valido que un puntero guarde la direccion de si mismo, de otro objeto del mismo tipo, de otro objeto de otro tipo, etc. lo que es cierto en C++.
Aunque es cierto que en un puntero se puede guardar cualquier direccion de memoria, lamentablemente no es cierto que despues la puedes usar validamente. Solo es valido y razonable guardar direcciones de memoria de datos tal como definiste el puntero.
Código C++:
Ver originalint i;
char c;
char *p;
p = &c; // valido y razonable
p = &i; // valido, pero peligroso, el compilador posiblemente genere un warning
Finalmente, cuando tienes 2 nodos distintos en una cola por ejemplo, uno de ellos puede tener como dato un puntero, es decir, guardador de direcciones de memoria, y guardar la direccion de memoria del nodo siguiente, del anterior, del mismo, del ultimo, etc.
El tema es mas largo de explicar, pero creo que esto es la base que necesitas para entender mas.