Returning a function pointer from a function in C/C++ - GeeksforGeeks

09 Sep, 2021
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
C++
// C program for the above approach#include <stdio.h> // Function to add the value 10 to// the variable avoid demo(int* a) { *a += 10; } // Driver Codeint main(){    int num = 20;     // ptr contains address of demo    // function or void    void (*ptr)(int*) = &demo;     // or (*ptr)(&num);    ptr(&num);     printf("%d", num);     return 0;}
// C++ program for the above approach#include <iostream>using namespace std; void demo(int& a){    a += 10;} // Driver Codeint main(){    int num = 20;     // Now ptr contains address of demo    // function or void    void (*ptr)(int*) = &demo;     // or (*ptr)(num);    ptr(num);     cout << num << endl;     return 0;}
  
30
 
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
C++
// C program for the above approach#include <stdio.h>typedef int (*ptr)(int*);typedef ptr (*pm)(); int fun1(int* y){    printf("geeks!!\n");    return *y + 10;} // Function that return type ptrptr fun(){    printf("Hello ");     // or return fun1;    /* or     int(*pt)(int*)=fun1;     return pt  */    return &fun1;} // Driver Codeint main(){    int a = 10;     pm u = fun;     printf("%d", (*u())(&a));     return 0;}
// C++ program for the above approach#include <iostream>using namespace std;typedef int (*ptr)(int*);typedef ptr (*pm)(); int fun1(int* y){    cout << "geeks!!" << endl;    return *y + 10;} // Function that returns the type ptrptr fun(){    cout << "Hello ";    return &fun1;} // Driver Codeint main(){    int a = 10;    pm u = fun;    cout << (*u())(&a) << endl;     return 0;}
  
Hello geeks!!
20
 
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
C++
// C program for the above approach#include <stdio.h> // This defines a type for// function prototypestypedef int (*ptr)(int*);typedef ptr (*pm)(); int fun1(int* y){    printf("geeks!!\n");    return *y + 10;} // fun() is a function with// return type ptrptr fun(){    printf("Hello ");     // or return fun1;    /* or     int(*pt)(int*)=fun1;     return pt  */    return &fun1;} // Driver codeint main(){    int a = 10;    pm u = fun;     /*    Above line assigns 'u' which is    of type 'pm' to an array of size    1 which has function pointers as    its elements and these function    pointers in turn return other    function pointer which points to    other functions.     Now this 'p' array contains a function    pointer 'u' which points to fun() and    this fun() returns another function    pointer which points to fun1().  */    int (*(*p[1])())(int*) = { u };     printf("%d", (*p[0]())(&a));}
// C++ program for the above approach#include <iostream>using namespace std; // This defines a type for// function prototypestypedef void (*ptr)(int&);typedef ptr (*pm)(); void fun1(int& z){    printf("geeks!!\n");    cout << z + 10 << endl;} // Function that returns type ptrptr fun(){    printf("Hello ");     // or return fun1;    /* or     int(*pt)(int*)=fun1;     return pt  */    return &fun1;} // Driver Codeint main(){    int a = 10;    pm u = fun;     /*    Above line assigns 'u' which is    of type 'pm' to an array of size    1 which has function pointers as its    elements and these function pointers    in turn return other function pointer    which points to other functions.     Now this 'p' array contains a function    pointer 'u' which points to fun() and    this fun() returns another function    pointer which points to fun1() and    this fun1() returns void.  */    void (*(*p[1])())(int&) = { u };     (*p[0]())(a);}
  
Hello geeks!!
20
 
wojdrja
C-Functions
CPP-Functions
Pointers
C Language
C Programs
C++
C++ Programs
Pointers
CPP
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
TCP Server-Client implementation in C
Exception Handling in C++
Multithreading in C
'this' pointer in C++
Arrow operator -> in C/C++ with Examples
Strings in C
Arrow operator -> in C/C++ with Examples
C Program to read contents of Whole File
Header files in C/C++ and its uses
Basics of File Handling in C