Posted on 20th October 2009No Responses
Pointers to Functions

Pointers to Functions
A particularly confusing yet powerful feature of C++ is the function pointer. Even though a function is not a variable, it still has a physical location in memory that can be assigned to a pointer. This address is the entry point of the function and it is the address used when the function is called. Once a pointer points to a function, the function can be called through that pointer. Function pointers also allow functions to be passed as arguments to other functions.
You obtain the address of a function by using the function’s name without any parentheses or arguments. (This is similar to the way an array’s address is obtained when only the array name, without indexes, is used.) To see how this is done, study the following program, paying close attention to the declarations:
#include
#include
void check(char *a, char *b,
int (*cmp)(const char *, const char *));
int main(void)
{
char s1[80], s2[80];
int (*p)(const char *, const char *);
p = strcmp;
gets(s1);
gets(s2);
check(s1, s2, p);
return 0;
}
void check(char *a, char *b,
int (*cmp)(const char *, const char *))
{
printf(”Testing for equality.\n”);
if(!(*cmp)(a, b)) printf(”Equal”);
else printf(”Not Equal”);
}

When the check() function is called, two character pointers and one function pointer are passed as parameters. Inside the function check(), the arguments are declared as character pointers and a function pointer. Notice how the function pointer is declared. You must use a similar form when declaring other function pointers, although the return type and parameters of the function may differ. The parentheses around the *cmp are necessary for the compiler to interpret this statement correctly.
Inside check(), the expression
(*cmp)(a, b)

calls strcmp() , which is pointed to by cmp, with the arguments a and b. The parentheses around *cmp are necessary. This is one way to call a function through a pointer. A second, simpler syntax, as shown here, may also be used.
cmp(a, b);
The reason that you will frequently see the first style is that it tips off anyone reading your code that a function is being called through a pointer. (That is, that cmp is a function pointer, not the name of a function.) Other than that, the two expressions are equivalent. Note that you can call check() by using strcmp() directly, as shown here:
check(s1, s2, strcmp); This eliminates the need for an additional pointer variable.
You may wonder why anyone would write a program in this way. Obviously, nothing is gained and significant confusion is introduced in the previous example. However, at times it is advantageous to pass functions as parameters or to create an array of functions. For example, when a compiler or interpreter is written, the parser (the part that evaluates expressions) often calls various support functions, such as those that compute mathematical operations (sine, cosine, tangent, etc.), perform I/O, or access system resources. Instead of having a large switch statement with all of these functions listed in it, an array of function pointers can be created. In this approach, the proper function is selected by its index. You can get the flavor of this type of usage by studying the expanded version of the previous example. In this program, check() can be made to check for either alphabetical equality or numeric equality by simply calling it with a different comparison function.

#include
#include
#include
#include
void check(char *a, char *b,
int (*cmp)(const char *, const char *));
int numcmp(const char *a, const char *b);
int main(void)
{
char s1[80], s2[80];
gets(s1);
gets(s2);
if(isalpha(*s1))
check(s1, s2, strcmp);
else
check(s1, s2, numcmp);
return 0;
}
void check(char *a, char *b,
int (*cmp)(const char *, const char *))
{
printf(”Testing for equality.\n”);
if(!(*cmp)(a, b)) printf(”Equal”);
else printf(”Not Equal”);
}
int numcmp(const char *a, const char *b)
{
if(atoi(a)==atoi(b)) return 0;
else return 1;
}

In this program, if you enter a letter, strcmp() is passed to check(). Otherwise, numcmp() is used. Since check() calls the function that it is passed, it can use different comparison functions in different cases.

Popularity: 1% [?]

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • Bitacoras.com
  • BlinkList
  • blogmarks
  • BlogMemes Fr
  • BlogMemes Sp
  • Blogosphere News
  • blogtercimlap
  • co.mments
  • connotea
  • Current
  • Design Float
  • Diigo
  • DotNetKicks
  • DZone
  • eKudos
  • email
Comments
Leave a Response