Understanding C Function Pointers

poornaMoksha's Avatar author of Understanding C Function Pointers
This is an article on Understanding C Function Pointers in C.
Rated 5.00 By 1 users
Function pointers are pointers that can hold the address of a particular type of functions. These pointers, once initialized can be used to call the function whose address they are pointing to.

Declaring Function Pointer



A function pointer can be declared in following way :

<return type of the function being pointed to> (*<name of func ptr>)(<expected arguments by the function being pointed to>)

For example, if we have a function 'int func(char)', then a function pointer to this function would be dclared as:

int(*func_ptr)(char)

So, here 'func_ptr' is the name of the function pointer which can point to a funtion that expects a 'char' as argument and returns an 'int'

Initializing & Using Function Pointer



Continuing with the above example, the func_ptr can be initialized as follows :
Code:
func_ptr = func; // the name of any function represents the address of function in memory.
func_ptr = &func; // This is also valid and same as the above line.
and can be used as :
Code:
int ret = fun_ptr('a'); // Since now func_pre holds the address of 'func', This line calls the function 'func' with argument 'a'
Example
Code:
#include<stdio.h>
#include<string.h>

int func(char c)
{
	printf("\n [%c] \n",c);
	return 0;
}

int main(void)
{
	int(*func_ptr)(char); // Declare a function pointer
	func_ptr = func; // store the address of 'func' in 'func_ptr'
	return func_ptr('a'); // Calling 'func' through 'func_ptr'
}

Where Function Pointers Are Used?



Function pointers are used mainly in callback mechanisms. A callback mechanism usually comes into picture when an application is using some library. Some functions defined in library expect a function pointer from application using which the library functions can send some error or status message to the application to keep the application informed of whats going inside.

For example, I have created an example to simulate the above stated scenario. Here the function 'divide()' can be thought of as a library function(though I have defined it in the same file for simplicity). The application registers the function 'func' as a callback to receive the status messages from the function 'divide()'.
Code:
#include<stdio.h>
#include<string.h>

int func(char *s)
{
	printf("Callback recieved : %s",s);
	return 0;
}

float divide(unsigned int a, unsigned int b, int(*status_callback)(char*))
{
	status_callback("\n Recieved values...validating\n");
	if(b == 0)
	{
		status_callback("\n b = 0 detected, aborting....\n");
		return -1;
	}
	status_callback("\n Validation complete, performing division\n");
	float ret = a/b;
	status_callback("\n Division complete, returning value\n");
	return ret;
}


int main(void)
{
	int(*func_ptr)(char*);
	unsigned int a = 6, b = 3;
	printf("\n This is a prgram to find a/b\n");

	func_ptr = func;

	float ret = divide(a,b,func_ptr);
	printf("\n divide returned [%f]\n",ret);

	return 0;

}
The output of the above program is as :

Code:
 This is a prgram to find a/b
Callback recieved : 
 Recieved values...validating
Callback recieved : 
 Validation complete, performing division
Callback recieved : 
 Division complete, returning value

 divide returned [2.000000]

Secret Tip for Function Pointer



We can make a particular function pointer a type during declaration using 'typedef'

typedef int(*func_ptr)(char);

So the above line makes 'func_ptr' as a type (just like we have int, char etc as types) and we can declare variables of this type

func_ptr ptr1;

So the above lines creates a ptr1 of type func_ptr, hence ptr1 becomes a function pointer of type func_ptr.
lionaneesh like this
vijaysince89's Avatar, Join Date: Sep 2011
Light Poster
Nice post. But in which kind of situation this will be more helpful.
poornaMoksha's Avatar, Join Date: Jan 2011
Ambitious contributor
Do you go through the section 'Where Function Pointers Are Used?' in the above article?
ankitasharma's Avatar
Banned
thanks for Sharing it is very useful to me.......
vijaysince89's Avatar, Join Date: Sep 2011
Light Poster
Yes I saw it. But my question is that the only purpose of using is this to get the status message alone?
poornaMoksha's Avatar, Join Date: Jan 2011
Ambitious contributor
Well, that was just an example...Another possible use could be in the following kind of functions..
http://pubs.opengroup.org/onlinepubs...ad_create.html
poornaMoksha's Avatar, Join Date: Jan 2011
Ambitious contributor
Quote:
Originally Posted by ankitasharma View Post
thanks for Sharing it is very useful to me.......
My pleasure
colinwood07's Avatar, Join Date: Sep 2011
Go4Expert Member
Thanks share the knowledge.....
lionaneesh's Avatar, Join Date: Mar 2010
Invasive contributor
WoaH! Nice to See you back! Nice tutorial I must! Say! All the best and Hoping for more of them!
poornaMoksha's Avatar, Join Date: Jan 2011
Ambitious contributor
Sure. Thanks for the appreciation.
Quote:
Originally Posted by lionaneesh View Post
WoaH! Nice to See you back! Nice tutorial I must! Say! All the best and Hoping for more of them!