The dereference operator (*) allows you to access the data that the pointer is pointing to.
E.g.
pPointer = 0; // sets the pointer to zero.
*pPointer = 0; // sets the memory pointed to by pPointer to zero.
Sometimes its necessary and convenient to double or triple dereference pointers to access data in structures or arrays. I have a queuing system in C that uses arrays of pointers. Each pointer, points to a structure. Now to access the queue I use a Head and Tail pointer. Accessing the data in the queue can be done through the use of a double dereference pointer.
E.g.
*pTail // Points to the memory address in the queue.
**pTail->access structure on heap // Points to the data at the memory address in the queue.
You can have a pointer to a pointer, or a pointer to a pointer to a pointer ect, ect. If you take notice of misra rules, they advise that you should not use more than 2 levels of indirection as it then becomes difficult to understand the code.