/* File: fptr4.c Exploring function pointers. */ #include /* Define a type for pointers to functions that take a void * ptr and returns nothing. */ typedef void (* FPTR_TYPE) (void *) ; /* some simple functions */ void add3(int *iptr) { *iptr = *iptr + 3 ; } void add5(double *dptr) { *dptr = *dptr + 5.0 ; } /* Takes a function parameter */ void apply (FPTR_TYPE addx, void *rptr) { addx(rptr) ; } main() { int m = 2, n = 4 ; double x = 5.0 ; FPTR_TYPE fptr ; printf("&x = %x\n", &x) ; printf("&m = %x\n", &m) ; printf("&n = %x\n", &n) ; printf("\n") ; add3(&m) ; printf("After add3(&m), m = %d\n", m) ; add5(&x) ; printf("After add5(&x), x = %lf\n", x) ; printf("\n") ; apply((FPTR_TYPE) &add3, &m) ; // typecast &add3 printf("Applying add3 to m, m = %d\n", m) ; apply((FPTR_TYPE) &add5, &x) ; printf("Applying add5 to x, x = %lf\n", x) ; printf("\n") ; fptr = (FPTR_TYPE) &add3 ; (*fptr) (&m) ; printf("Applying fptr to m, m = %d\n", m) ; fptr = (FPTR_TYPE) &add5 ; (*fptr) (&x) ; printf("Applying fptr to x, x = %lf\n", x) ; /* Bad behavior follows, fptr points to add5 */ (*fptr) (&m) ; printf("Applying fptr to m, m = %d\n", m) ; printf("n = %d\n", n) ; }