Example. Take the Windows GDI LineDDA function. It takes 2 points as input and calculates all points that make a line between them. Now LineDDA calculates the first point, but it can't just return to the caller because the other points have to be calculated too. OTOH, it doesn't know what to do with the point (should it be drawn on a canvas, or added to a list?) That's why the calling routine has to supply a pointer to a callback function. Each time LineDDA has calculated a point it passes it to the callback function. The callback function may draw the point on a canvas, that's part of the application, and after it's done it returns control back to the LineDDA function, which then goes on to calculate the next point. So the application calls LineDDA, and during the LineDDA algorithm it calls back an application function. In the LineDDA case the callback will called several times, but it could also be just once.
Another example. Hans-Bernhard already mentioned sorting. Sorting can only be done within ordered set. Numerical lists are ordered differently from numerical lists, so you'll have different compare functions. Apart from the comparison itself however, the sorting algorithm can be the same for any type of set. So you write a sort routine requiring a callback function. The sorting routine knows when which item should be compared to which other. That's defined in the algorithm. But it doesn't know how thsi comparison is to be done. So it calls the callback, saying "hey, I've got an item A and an item B here which require comparison. Which should go first?". The callback function decides and returns the result to the sorting routine, which may e.g. decide that A and B should be swapped.
HTH
-- Steven