A function pointer is a pointer that holds the memory address of a function.
How to declare a function pointer in C?
Consider the function prototype as below:
void sum ();
According to the above function prototype, the function sum will not take any arguments, and will not return anything.
So we can declare a function pointer as below:
void (*fp) ();
Here “*fp” is a function pointer, that will not accept any function parameters and returns void.
The function pointer will be similar to function prototype.
More examples for function pointers:
int (*fp) (double) => “fp” is a function pointer that accepts double and returns int.
void (*fp)(char*) => “fp” is a function pointer that accepts a char pointer and returns void.
double* (*fp)(int, int) => “fp” is a function pointer that accepts two integer variables and returns a pointer to a double.
Note:
A function pointer should always be written inside a braces.
Consider a below declaration:
int *f();
The above is a simple function prototype.
Consider a below declaration:
int (*f) ();
The above is a function pointer that will not accept any variables but returns int variable.
How to use a function pointer in C?
We can make use of Pointer to function to make a call back function.
If we have a addition function as below:
int add() { return (10+20); }
For the above function, a function pointer can be declared as below:
int (*fPtr) ();
Here “*fPtr” is a function pointer, that will not take any arguments and return an integer pointer.
Now you need to assign the function to that function pointer as:
fPtr = &add;
Now you can make a function call as:
result = (*ptr)();
Full Example:
#include<stdio.h> int add (); int main () { int result; int (*ptr)(); ptr = &add; result = (*ptr)(); printf("The sum is %d\n",result); } int add() { return (5 + 6); }
Output:
The sum is 11
How to pass a function pointer ?
Passing a function pointer is very simple.
We need to create a function pointer that matches the calling function.
For Example:
#include<stdio.h> #include<stdlib.h> int add (int num1, int num2) { return (num1 + num2); } int subtract (int num1, int num2) { return (num1 - num2); } // fptr is a function pointer, that will accept // 2 int values and return a int value typedef int (*fptr) (int, int); // calculate is a function what accepts a function pointer // and it will call appropriate add or subtract function // based on the operation value. int calculate(fptr operation, int num1, int num2) { return operation(num1, num2); } int main () { int num1 = 10; int num2 = 20; printf("The num1 = %d, num2 = %d, the addition is = %d\n", num1, num2, calculate(add, num1, num2)); printf("The num1 = %d, num2 = %d, the subtract is = %d\n", num1, num2, calculate(subtract, num1, num2)); return 0; }
Output:
The num1 = 10, num2 = 20, the addition is = 30 The num1 = 10, num2 = 20, the subtract is = -10
How to return a function pointer ?
#include<stdio.h> #include<stdlib.h> int add (int num1, int num2) { return (num1 + num2); } int subtract (int num1, int num2) { return (num1 - num2); } // fptr is a function pointer, that will accept // 2 int values and return a int value typedef int (*fptr) (int, int); // select is a function that will return // approprite function pointer // based on the opCode fptr select (char opCode) { switch(opCode) { case '+' : return add; case '-' : return subtract; } } // calculate is a function what accepts a operation code as char // and it will call appropriate add or subtract function // based on the operation value. int calculate(char opCode, int num1, int num2) { fptr operation = select(opCode); return operation(num1, num2); } int main () { int num1 = 10; int num2 = 20; printf("The num1 = %d, num2 = %d, the addition is = %d\n", num1, num2, calculate('+', num1, num2)); printf("The num1 = %d, num2 = %d, the subtract is = %d\n", num1, num2, calculate('-', num1, num2)); return 0; }
Output:
The num1 = 10, num2 = 20, the addition is = 30 The num1 = 10, num2 = 20, the subtract is = -10