Definition
Function pointers point to executable code at a particular piece of memory. Dereferencing the function pointer allows the code in the memory block to be executed. Main benefit of function pointers is that they provide a straightforward mechanism for choosing a function to execute at runtime.
Important points about Function Pointer
- Unlike normal pointers, a function pointer points to code, not data. A function pointer stores the start address of executable code.
- Function name can also be used to get functions address. Also address operator (&) can also be used.
- A function pointer can be passed as an argument and can also be returned from a function.
Syntax
Following illustrates the syntax of declaring a function pointer:
<returnType> (*<functionName>) (functionArguments);
Syntax of declaring a function pointer is similar to the syntax of declaring a function. Only difference is that instead of using the function name, use a pointer name inside the parentheses (). In the above syntax
returnType
is the return type of the function pointer. It can be any valid type such as int, float, char, or void.- Name of function pointer is inside parentheses.
functionArguments
specify all parameters of the function with their corresponding types. Function pointer only can refer to a function with the same signature.
void (*pf)(int);
In above example *pf is the pointer to a function. void is the return type of that function, and int is the argument type of that function.
Defining Function Type
It is convenient to use a typedef to define the function type. For example
typedef void (*functionPtr)(int);
Above defined a type functionPtr
. Variables of this type point to function that take an int as a parameter and don’t return anything. It can be use to declare variable of type functionPtr
as shown below
functionPtr fPtr;
Example
Below example shows usage of function pointer. Function op
takes three argument, last argument is function pointer.
#include <iostream> typedef double (*functionPtr)(double, double); double add(double val1, double val2) { return val1 + val2; } double substract(double val1, double val2) { return val1 - val2; } double op(double val1, double val2, functionPtr f) { return (*f)(val1, val2); } int main() { double a = 5.0; double b = 10.0; std::cout << "Add: " << op(a, b, add) << std::endl; std::cout << "Substract: " << op(a, b, substract) << std::endl; return 0; }
functionPtr
specify returns double
and takes two double values. op
dereferences the function pointer in order to execute the correct function – add or substract.
Below shows usage of function pointer.
// Define a function pointer and initialize to NULL // pt2Function is a pointer to a function which returns an int and takes a float and two char int (*pt2Function)(float, char, char) = NULL; int DoMore(float a, char b, char c) { return a - b + c; } // Assign an address to a Function Pointer pt2Function = &DoMore; // Calling a Function using a Function Pointer int result1 = pt2Function(12, 'a', 'b'); int result2 = (*pt2Function) (12, 'a', 'b'); // Pass a Function Pointer as an Argument. void PassPtr(int (*pt2Function)(float, char, char)) { // call using function pointer int result = (*pt2Function)(12, 'a', 'b'); } // Declare function pointer type typedef float(*pt2Function)(float, float); float Plus(float a, float b) { return a + b; } float Minus(float a, float b) { return a - b; } // Function takes a char and returns a function pointer which is defined with the typedef above. pt2Function GetPtr2(const char opCode) { if (opCode == '+') { return &Plus; } else { return &Minus; } } // Arrays of Function Pointers typedef int (*pt2Function)(float, char, char); void Array_Of_Function_Pointers() { // Define arrays and set each element to NULL pt2Function funcArr[10] = { NULL }; // Assign the function's address funcArr[0] = funcArr[1] = &DoMore; }