A),char * (*fun1)(char * p1,char * p2);
B),char * *fun2(char * p1,char * p2);
C),char * fun3(char * p1,char * p2);
后两个都不难理解,那么第一个是什么呢?
这里fun1 不是什么函数名,而是一个指针变量,它指向一个函数。这个函数有两个指针类型的参数,函数的返回值也是一个指针。
函数指针使用的例子
上面我们定义了一个函数指针,但如何来使用它呢?先看如下例子:
- #include <stdio.h>
- #include <string.h>
- char * fun(char * p1,char * p2)
- {
- int i = 0;
- i = strcmp(p1,p2);
- if (0 == i)
- {
- return p1;
- }
- else
- {
- return p2;
- }
- }
- int main()
- {
- char * (*pf)(char * p1,char * p2);
- pf = &fun;
- (*pf) ("aa","bb");//注意这的调用方式,同样用pf("aa","bb")也行
- return 0;
- }
这里需要注意到是,在Visual C++6.0 里,给函数指针赋值时,可以用&fun 或直接用函数名fun。这是因为函数名被编译之后其实就是一个地址,所以这里两种用法没有本质的差别。
~~函数指针数组
现在我们清楚表达式“char * (*pf)(char * p)”定义的是一个函数指针pf。既然pf 是一个指针,那就可以储存在一个数组里。把上式修改一下:char * (*pf[3])(char * p);
- char * fun1(char * p);
- char * fun2(char * p);
- char * fun3(char * p);
- int main()
- {
- char * (*pf[3])(char * p);
- pf[0] = fun1; // 可以直接用函数名
- pf[1] = &fun2; // 可以用函数名加上取地址符
- pf[2] = &fun3;
- pf[0]("fun1");
- pf[0]("fun2");//注意用函数指针调用函数的方法
- pf[0]("fun3");
- return 0;
- }
~~~函数指针数组的指针
char * (*a[3])(char * p);
char * (*(*pf)[3])(char * p);
pf = &a;
这里的关系就相当于定义一个数组,再定义一个指向数组的指针。当然是这样了
- char * fun1(char * p);
- char * fun2(char * p);
- char * fun3(char * p);
- int main()
- {
- char * (*a[3])(char * p);
- char * (*(*pf)[3])(char * p);
- pf = &a;
- a[0] = fun1;
- a[1] = &fun2;
- a[2] = &fun3;
- pf[0][0]("fun1");
- pf[0][1]("fun2");
- pf[0][2]("fun3");
- return 0;
- }
一个函数不仅可以带回一个整型数据的值,字符类型值和实型类型的值,还可以带回指针类型的数据,使其指向某个地址单元。返回指针的函数,一般定义格式为:
类型标识符 *函数名(参数表)
int *f(x,y);其中x,y是形式参数,f是函数名,调用后返回一个指向整型数据的地址指针。f(x,y)是函数,其值是指针。
如:char *ch();表示的就是一个返回字符型指针的函数
函数指针定义
函数类型 (*指针变量名)(形参列表);
“函数类型”说明函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int (*f)(int x);
double (*ptr)(double x);
在定义函数指针时请注意:
函数指针和它指向的函数的参数个数和类型都应该是—致的;
函数指针的类型和函数的返回值类型也必须是一致的。
总结:
函数指针是一个指向函数的指针,而指针函数只是说明他是一个返回值为指针的函数,
函数指针可以用来指向一个函数。