定義形式:類型 (*指針變量名)(參數列表);
例如:int (*p)(int i,int j);
在這里 int是函數的返回類型,*p是指向函數的指針,(int i,int j);是函數的參數
注意 : int f(int i, int j);
int (p)(int i, int j);
前者是返回值是指針的函數;后者是一個指向函數的指針。
示例1
#include <stdio.h>
#define GET_MAX 0
#define GET_MIN 1
int get_max(int i,int j)
{
return i>j?i:j;
}
int get_min(int i,int j)
{
return i>j?j:i;
}
int compare(int i,int j,int flag)
{
int ret;
//這里定義了一個函數指針,就可以根據傳入的flag,靈活地決定其是指向求大數或求小數的函數
//便於方便靈活地調用各類函數
int (*p)(int,int);
if(flag == GET_MAX)
{
p = get_max;
}else{
p = get_min;
}
ret = p(i,j);//或者ret = (*p)(i,j);
return ret;
}
int main()
{
int i = 5,j = 10,ret;
ret = compare(i,j,GET_MAX);
printf("The MAX is %d\n",ret);
ret = compare(i,j,GET_MIN);
printf("The MIN is %d\n",ret);
return 0 ;
}
示例2 函數指針作為參數
/**
比較兩個字符串,相等返回Equal,不相等返回Not Equal
**/
#include <stdio.h>
#include <string.h>
void check(char *a,char *b,int (*cmp)(const char *,const char *));
int main()
{
char s1[80],s2[80];
int (*p)(const char *,const char *);
//將庫函數strcmp的地址賦值給函數指針p
p=strcmp;
printf("請輸入兩個字符串.\n");
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");
//表達式(*cmp)(a,b)調用strcmp,由cmp指向庫函數strcmp(),由a和b作調用strcmp()的參數。
//調用時,與聲明的情況類似,必須在*cmp周圍使用一對括號,使編譯程序正確操作
if((*cmp)(a,b)==0)
printf("Equal\n");
else
printf("Not Equal\n");
}
示例3
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
//check()函數的第3個函數是函數指針,就可以根據具體情況傳入不同的處理函數
void check(char *a,char *b,int (*cmp)(const char *,const char *));
//自定義的比較兩個字符串的函數
int compvalues(const char *a,const char *b);
int main()
{
char s1[80],s2[80];
printf("輸入兩個數字或自婦產\n");
gets(s1);
gets(s2);
if(isdigit(*s1)){ //如果是數字,則用函數指針傳入數字比較函數進行處理
printf("Testing values for equality.\n");
check(s1,s2,compvalues);
}else{//如果是字符串,則用函數指針傳入庫函數strcmp進行處理
printf("Testing strings for equality.\n");
check(s1,s2,strcmp);
}
}
void check(char *a,char *b,int (*cmp)(const char *,const char *))
{
if((*cmp)(a,b)==0)
printf("Equal.\n");
else
printf("Not Equal.\n");
}
int compvalues(const char *a,const char *b)
{
if(atoi(a) == atoi(b))
return 0;
else
return 1;
}