Three usage -
1. Callback functionality
2. State-machine Implementation (basically where u need a array of functions and need to call one of them on need basis)
3. To bind function at run time as per requirment.
In the large scale development . each team develops some part of software .
and provide function pointer so other team can bind their function with these pointer.
Like if one vender don not want to give the code then he will give binary , header file and User manual
In user manual he will describe the the function argument their purpose. So that user can bind their function with pointer and can use the code of vender.