Programming in C: Unit III (b): Pointers

Function Pointers

with Example C Programs

C allows operations with pointers to functions. We have seen earlier in this chapter that every function code along with its variables is allocated some space in the memory. Thus, every function has an address.

FUNCTION POINTERS

C allows operations with pointers to functions. We have seen earlier in this chapter that every function code along with its variables is allocated some space in the memory. Thus, every function has an address. Function pointers are pointer variables that point to the address of a function. Like other pointer variables, function pointers can be declared, assigned values, and used to access the functions they point to.

This is a useful technique for passing a function as an argument to another function. In order to declare a pointer to a function we have to declare it like the prototype of the function except that the name of the function is enclosed between parentheses () and an asterisk (*) is inserted before the name. The syntax of declaring a function pointer can be given as

return_type (*function_pointer_name) (argument_list);

Look at the declaration below in which we declare a pointer to a function that returns an integer value and accepts two arguments one of type int and the other of type float.

int (*func) (int a, float b);

Because of precedence, if you do not put the function name within parenthesis, you will end up declaring a function returning a pointer as shown:

/* function returning pointer to int */ int *func (int a, float b);

Initializing a Function Pointer

As in case of other pointer variables, a function pointer must be initialized prior to use. If we have declared a pointer to the function, then that pointer can be assigned the address of the correct function just by using its name. Like in the case of an array, a function name is changed into an address when it's used in an expression. It is optional to use the address operator (&) in front of the function name.

For example, if fp is a function pointer and we have a function add () with prototype given as

int add (int, int);

Then writing fp = add; initializes the function pointer fp with the address of add ().

Calling a Function Using a Function Pointer

When a pointer to a function is declared, it can be called using one of two forms:

(*func) (1,2);

OR

func (1,2);

Look at the program given below which makes use of a pointer to a function.

#include <stdio.h>

void print(int n);

void (*fp) (int);

main()

{

fp = print;

(*fp) (10);

fp (20);

return 0;

}

void print (int value)

{

printf("\n %d", value);

}

Output

10

20

Now let us write another code that illustrates how the contents of fp can be changed at run time to point to two different functions during program execution.

#include <stdio.h>

float (*func) (float, float); //Define a function pointer

float add (float, float);

float sub (float, float);

main ()

{

func = add; // function pointer points to add

printf("\n Addition %f", func (9.5, 3.1));

func = sub; // function pointer points to sub

printf("\n Subtraction = %f", func (9.5, 3.1));

}

float add (float x, float y)

{

return (x + y);

}

float sub (float x, float y)

{

return (x - y);

}

Output

Addition = 12.80000

Subtraction = 8.40000

A function pointer can be declared and initialize to NULL as shown below:

int (*fp) (int) = NULL;

Comparing Function Pointers

Comparison operators such as = = and != can be used the same way as usual. Consider the code given below which checks if fp actually contains the address of the function print (int).

if (fp >0) { // check if initialized

if (fp == print)

printf("\n Pointer points to print ");

else

printf("\n Pointer not initialized!");

}

Passing a Function Pointer as an Argument to a Function

A function pointer can be passed as the calling argument of a function. This is in fact necessary if you want to pass a pointer to a callback function. The following code shows how to pass a pointer to a function which returns an int and accepts two int values.

Note that in the program below, the function operate calls the functions add and subtract with the following line:

result = (*operate_fp) (num1,num2);

#include <stdio.h>

int add (int, int);

int subt (int, int);

int operate (int (*operate_fp) (int, int), int, int);

main()

{

int result;

result = operate (add, 9, 7);

printf ("\n Addition result = %d", result); n

result = operate (sub, 9, 7);

printf ("\n Subtraction = %d", result);

return 0;

}

int add (int a, int b)

{

return (a + b);

}

int subtract (int a, int b)

{

return (a - b);

}

int operate (int (*operate_fp) (int, int), int a, int b)

{

int result;

result = (*operate_fp) (a, b);

return result;

}

Output

Addition = 16

Subtraction = 2

Programming in C: Unit III (b): Pointers : Tag: : with Example C Programs - Function Pointers