Just like char and int, a function is a fundamental feature of C. As such, you can declare a pointer to one: which means that you can pass which function to call to another function to help it do its job. For example, if you had a graph() function that displayed a graph, you could pass which function to graph into graph().

// A couple of external definitions to make the example clearer
extern unsigned int screenWidth;
extern void plotXY(double x, double y);

// The graph() function.
// Pass in the bounds: the minimum and maximum X and Y that should be plotted.
// Also pass in the actual function to plot.
void graph(double minX, double minY,
           double maxX, double maxY,
           ???? *fn) {            // See below for syntax

    double stepX = (maxX - minX) / screenWidth;
    for (double x=minX; x<maxX; x+=stepX) {

        double y = fn(x);         // Get y for this x by calling passed-in fn()

        if (minY<=y && y<maxY) {
            plotXY(x, y);         // Plot calculated point
        } // if
    } for
} // graph(minX, minY, maxX, maxY, fn)

Usage

So the above code will graph whatever function you passed into it - as long as that function meets certain criteria: namely, that you pass a double in and get a double out. There are many functions like that - sin(), cos(), tan(), exp() etc. - but there are many that aren’t, such as graph() itself!

Syntax

So how do you specify which functions you can pass into graph() and which ones you can’t? The conventional way is by using a syntax that may not be easy to read or understand:

double (*fn)(double); // fn is a pointer-to-function that takes a double and returns one

The problem above is that there are two things trying to be defined at the same time: the structure of the function, and the fact that it’s a pointer. So, split the two definitions! But by using typedef, a better syntax (easier to read & understand) can be achieved.