In C++, you don't really need to use them, as there are safer and better methods in that language.
In C, they are typically used for generic programming. For example, if you have your own data type like a linked list, stack, binary tree or whatever, you can make generic algoriths by using a function pointer.
Like this (pseudo code):
typdef struct /* some sort of custom type */
{
MyNode node[x];
...
} MyList;
void mylist_execute (MyList* list, void(*fptr)(MyNode*))
{
for(i=0; i < size of list; i++)
{
fptr(list->node[i]);
}
}
void print(MyNode* node)
{
printf("...", node);
}
/* implement whatever fancy functions you need... */
...
mylist_execute(list, print);
mylist_execute(list, sum);
mylist_execute(list, clear);
and so on...
Some C library functions like qsort() use function pointers in this way.
Another example is DLL functions in Windows programming, where you ask the DLL for a function name and get a function pointer in return, which you can use to call the function.
Function pointers are also useful in low-level programming. For example, the only way you can declare a CPU's interrupt vector table in C, is as an array of function pointers.
There are plenty of uses for them, the use is "generic C programming".