In C/ C++, like normal data pointers(int *, char *, etc), there can be pointers to functions. Every function created in a program gets an address in memory since pointers can be used in C/C++, so a pointer to a function can also be created.
Syntax:
return type (*function_pointer_name) (argument_type_1, argument_type_2, ……, argument_type_n) = &function_name;
OR
return type (*function_pointer_name) (argument_type_1, argument_type_2, ……, argument_type_n) = function_name;
NOTE: Arguments type and return type of function pointer should match with the actual function present in the program.
Program 1:
C
#include <stdio.h>
void demo( int * a) { *a += 10; }
int main()
{
int num = 20;
void (*ptr)( int *) = &demo;
ptr(&num);
printf ( "%d" , num);
return 0;
}
|
C++
#include <iostream>
using namespace std;
void demo( int & a)
{
a += 10;
}
int main()
{
int num = 20;
void (*ptr)( int *) = &demo;
ptr(num);
cout << num << endl;
return 0;
}
|
Return Function Pointer From Function: To return a function pointer from a function, the return type of function should be a pointer to another function. But the compiler doesn’t accept such a return type for a function, so we need to define a type that represents that particular function pointer.
Syntax :
typedef return type (*function_pointer_name) (argument_type_1, argument_type_2, ……, argument_type_n);
This creates a type which represents a pointer for a particular function.
Program 2:
C
#include <stdio.h>
typedef int (*ptr)( int *);
typedef ptr (*pm)();
int fun1( int * y)
{
printf ( "geeks!!\n" );
return *y + 10;
}
ptr fun()
{
printf ( "Hello " );
return &fun1;
}
int main()
{
int a = 10;
pm u = fun;
printf ( "%d" , (*u())(&a));
return 0;
}
|
C++
#include <iostream>
using namespace std;
typedef int (*ptr)( int *);
typedef ptr (*pm)();
int fun1( int * y)
{
cout << "geeks!!" << endl;
return *y + 10;
}
ptr fun()
{
cout << "Hello " ;
return &fun1;
}
int main()
{
int a = 10;
pm u = fun;
cout << (*u())(&a) << endl;
return 0;
}
|
Declaring an array that has two function pointers as to its elements and these function pointers, in turn, return other function pointers which point to other functions. The logic of the driver code main() function can be changed in the above program as:
Program 3:
C
#include <stdio.h>
typedef int (*ptr)( int *);
typedef ptr (*pm)();
int fun1( int * y)
{
printf ( "geeks!!\n" );
return *y + 10;
}
ptr fun()
{
printf ( "Hello " );
return &fun1;
}
int main()
{
int a = 10;
pm u = fun;
int (*(*p[1])())( int *) = { u };
printf ( "%d" , (*p[0]())(&a));
}
|
C++
#include <iostream>
using namespace std;
typedef void (*ptr)( int &);
typedef ptr (*pm)();
void fun1( int & z)
{
printf ( "geeks!!\n" );
cout << z + 10 << endl;
}
ptr fun()
{
printf ( "Hello " );
return &fun1;
}
int main()
{
int a = 10;
pm u = fun;
void (*(*p[1])())( int &) = { u };
(*p[0]())(a);
}
|
In both C and C++, you can return a function pointer from a function by declaring the return type of the function as a pointer to a function.
Here’s an example in C:
C
#include <stdio.h>
int add( int a, int b) {
return a + b;
}
int subtract( int a, int b) {
return a - b;
}
int (*operation( char op))( int , int ) {
if (op == '+' ) {
return &add;
} else if (op == '-' ) {
return &subtract;
} else {
return NULL;
}
}
int main() {
int (*func_ptr)( int , int ) = operation( '+' );
printf ( "%d\n" , func_ptr(4, 5));
return 0;
}
|
In this example, we have two functions called add() and subtract() that take two integer arguments and return an integer value. We also have a function called operation() that takes a character argument op and returns a function pointer to add() or subtract() depending on the value of op. Finally, in main(), we call operation() with ‘+’ as the argument and store the result in a function pointer called func_ptr. We then call func_ptr() with 4 and 5 as arguments and print the result to the console.
Here’s the same example in C++:
C++
#include <iostream>
using namespace std;
int add( int a, int b) {
return a + b;
}
int subtract( int a, int b) {
return a - b;
}
int (*get_operation( char op))( int , int ) {
if (op == '+' ) {
return &add;
} else if (op == '-' ) {
return &subtract;
} else {
return NULL;
}
}
int main() {
int (*op)( int , int ) = get_operation( '+' );
int result = op(3, 4);
cout << "Result: " << result << endl;
return 0;
}
|
Whether you're preparing for your first job interview or aiming to upskill in this ever-evolving tech landscape,
GeeksforGeeks Courses are your key to success. We provide top-quality content at affordable prices, all geared towards accelerating your growth in a time-bound manner. Join the millions we've already empowered, and we're here to do the same for you. Don't miss out -
check it out now!