一,函数指针基础
#include <stdio.h>
int max(int x,int y){
int z;
if(x>y) z=x;
else z=y;
return z;
}
void main()
{
int a,b,c;
int(*p)(int ,int);//定义函数指针;注意*p两边的圆括号不能省略!参数类型可以省略(也就是说可以写成 int(*p)();)
p=max;//将函数的入口地址赋值给函数指针(函数的入口地址就是函数的名称)
scanf("%d,%d",&a,&b);
c=(*p)(a,b);
printf("%d,%d,max is%d\n",a,b,c);
}
二.利用typedef来定义函数指针
#include <stdio.h>
int max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
return z;
}
void main()
{
typedef int(*PTR)(int,int);// typedef的功能是定义新的类型,定义了一种PTR的类型
int a,b,c;
PTR ptr;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("%d,%d,max is%d\n",a,b,c);
}
三,是在第二种方法的基础上演变而来
#include <stdio.h>
int max(int x,int y)
{
int z;
if(x>y) z=x;
else z=y;
return z;
}
void main()
{
typedef int(PTR)(int,int);
int a,b,c;
PTR* ptr;
ptr=max;
scanf("%d,%d",&a,&b);
c=(*ptr)(a,b);
printf("%d,%d,max is%d\n",a,b,c);
}
四.函数指针数组
例如:
int (*fun[2])()={fun1,fun2};
其实这个还是比较好理解的;每个元素存储的是函数的首地址;
如果调用第一个方法的话:fun[0](参数值...);
说到这里,最近学习COM组件的时候就遇到了函数指针数组的问题,在一个结构体中,成员是函数指针:
typedef struct {
SetStringPtr * SetString;
GetStringPtr * GetString;
} IExampleVtbl;
其中SetStringPtr 与GetStringPtr 是通过typedef定义的新类型:
typedef long SetStringPtr(char *);
typedef long GetStringPtr(char *, long);
初始化: IExampleVtbl IExample_Vtbl = {SetString, GetString};//SetString与GetString是已经定义的函数的名称
函数指针的应用在COM基础这块体现比较充分(专业术语有个叫虚表)!