Section 29.1 Function Pointers
Just like
int *p; declares
p as a pointer to an
int, we can declare a pointer to a function. The syntax looks a little unusual at first:
void (*functionptr)(int);
This declares
functionptr as a pointer to a function that takes a single
int argument and returns nothing (
void). Just like arrays, function names themselves act as addresses, so both of the following work to assign a function pointer:
functionptr = &printNumber; /* explicit address-of */
functionptr = printNumber; /* implicit conversion, same effect */
To actually call the function through the pointer, we
dereference it (though C is forgiving here, and
functionptr(x) works too):
(*functionptr)(my_number);
Let’s see this in action:
admin.....open in new window
A function pointer can be reassigned to point to a
different function at any time, as long as that function has a matching prototype (same return type and same parameter types). This is exactly what lets us pick a function based on user input, rather than hard-coding an
if/
else that calls one function or the other directly:
admin.....open in new window
Activity 29.1.
Define two functions,
float square(float x) and
float cube(float x). Ask the user to enter a number and choose whether they want to square (2) or cube (3) it. Declare a function pointer, and use an
if/
else statement to assign it to the correct function based on the user’s choice. Finally, use your function pointer to calculate and print the result.
admin.....open in new window
Activity 29.2.
Let’s use a function pointer to convert a whole
batch of temperatures! We have two functions,
float cTof(float c) and
float fToc(float f). Ask the user which conversion they want to do (1 for Celsius→Fahrenheit, 2 for Fahrenheit→Celsius), declare a function pointer, and assign it to the correct function based on the user’s choice. Then write a
for loop that iterates through the temperature array, passing each value to your function pointer and printing the result.
admin.....open in new window