Oh, those function pointers...
utzoo!decvax!yale-com!hawley
utzoo!decvax!yale-com!hawley
Wed Nov 10 23:56:15 AEST 1982
A long time ago, I sent out a note about C function pointers to some other
newsgroup. I am the only person I know who likes and uses these things.
Here is an idiom I commonly run into:
/* This file gives a simple example of C function pointers.
* Function pointers are a VERY useful construct.
* A typical application: keep a table of functions,
* choose a function in the table, and call it.
*
* Function pointer declarations can be confusing.
* Here is how I "read" these declarations:
*
* int f; /* "f is an int." *
* int *f; /* "f is a pointer to an int" *
* int (*f)(); /* "f is a pointer to a function returning an int" *
*
* The '*' means "is a pointer to a" and the empty parens '()' mean
* "function returning". The type "pointer to function returning"
* is written "(*)()", and can be used in casts, sizeofs(), etc.
*
* For more information: send me mail.
*
*/
int a(), b(), c(), d(), e(); /* Some dull functions. */
int (*ftable[])() = /* A table of functions: */
{ /* ie, "ftable is an array of pointers */
a, b, c, d, e /* to functions that return an int." */
};
/* N_FUNCTIONS is the number of functions in the function table.
*/
# define N_FUNCTIONS ( sizeof( ftable )/sizeof( ftable[0] ) )
/* This could also have been more opaquely and dangerously written as:
# define N_FUNCTIONS ( sizeof( ftable )/sizeof( int (*)() ) )
*/
main()
{
extern int (*ftable[])(); /* the function table */
int (*function)(); /* a function pointer, taken from ftable */
int i;
/* Loop through the functions in the table, */
/* calling each one: */
for (i = 0; i < N_FUNCTIONS; i++)
{
function = ftable[i];
(*function)("Frootle."); /* call function i */
}
}
/* Here are the functions "a" through "e". They are all the same, all dull.
*/
a(s)
char *s;
{
printf("I am function A. My argument is \"%s\"\n", s);
}
b(s)
char *s;
{
printf("I am function B. My argument is \"%s\"\n", s);
}
c(s)
char *s;
{
printf("I am function C. My argument is \"%s\"\n", s);
}
d(s)
char *s;
{
printf("I am function D. My argument is \"%s\"\n", s);
}
e(s)
char *s;
{
printf("I am function E. My argument is \"%s\"\n", s);
}
More information about the Comp.lang.c
mailing list