函数名可以理解为数组名,表示函数体的首地址,并不是完全意义上的函数指针。
char func() 定义函数返回值为char形
int * func1(char a)定义函数返回值为int形的指针
简单的函数指针的用法
形式:返回类型(*函数名)(参数表)
char(*pFun)(int);
//typedef char(*pFun)(int) //跟上一行功能等同
/*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。此部分在下文详细说明*/
char glFun(int a)
{
return;
}
void main()
{
pFun =glFun; //函数指针 pFun,指向函数 glFun
(*pFun)(2);
}
利用typedef定义函数指针
(一)、typedef int (*MYFUN)(int, int);
这种用法一般用在给函数定义别名的时候
上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int
在分析这种形式的定义的时候可以用下面的方法:
先去掉typedef 和别名, 剩下的就是原变量的类型.
去掉typedef和MYFUN以后就剩:
int (*)(int, int) 为函数指针
MYFUN funcptr; 通过MYFUN 定义int (*)(int, int)的函数指针变量
typedef的功能是定义新的类型。定义了一种MYFUN的类型,这种类型为指向某种函数的指针,这种函数以两个int为参数并返回int类型。后面就可以像使用int,char一样使用MYFUN了。MYFUN pFun; 定义函数指针变量pFun。
(二)、利用typedef 定义了一个新的类型,这种类型是一个函数:
typedef void myfun(int a,int b);
然后可以用这个类型定义一个指针,这个指针指向一个函数.
myfun *fun1;
myfun *fun2;
不管使用上面的哪一种方法来定义函数指针,参考int *p,在使用时候,*p才代表其本身,p代表为地址,因此在调用函数的时候,必须通过(*fun1)(.....)的方式进行函数指针的调用。
函数强制类型转化
(一)、 void func(int, int){.....}; //定义func函数
int (*funcptr)(int, int); //定义函数指针变量funcptr,具体类型为:int (*)(int ,int)
将func的地址赋给funcptr函数指针,需要对普通函数func强制类型转化,如下:
funcptr = (int (*)(int, int)) func;
(二)、如上文所讲用 typedef int (*MYFUN)(int, int); 定义函数指针后,可以直接通过:
MYFUN funcptr; 定义int (*)(int, int)的函数指针变量
同时也可以使用新定义的MYFUN 类型,对普通函数func强制类型转化
funcptr = (MYFUN ) func;
(三)、如上文所讲用typedef void myfun(int a,int b); 定义函数类型后,可以通过:
myfun *fun1; 定义函数指针
同时也可以使用新定义的myfun 函数类型,对普通函数func强制类型转化
funcptr = (myfun *) func; //myfun只代表函数,而需要的却是指向函数的指针,因此需要myfun *
方法(一)为原始的函数指针原型进行函数的类型转化,(二)通过定义的函数指针类型对函数进行转化,(三)通过定义的函数类型定义对应的指针对函数进行转化,参考(int *)a;
int* (*a[5])(int, char*); 是什么意思
带指针返回的函数指针数组,int* (*a[5])(int, char*);
int *函数返回值得类型是一个指针变量
(*a[5]) 函数指针名为a,共有5个元素
(int, char*); 带有两个参数int型参数和char指针型参数