</pre><pre name="code" class="cpp">/***********************
功能:指向函数的指针
日期:2014年12月6日21:06:58
************************/
#include<stdio.h>
#include<stdlib.h>
int min(int a, int b)
{
if(a < b) return a;
else return b;
}
int main()
{
int (*pmin)(int ,int);//定义了一个指向函数的指针变量。函数的格式是返回值为int型,形参列表(int,int)
<span style="white-space:pre"> </span>//pmin定义后,它可以指向任何满足该格式的函数。
int a, b, m;
pmin = min;//将min函数的首地址值赋给指针变量pmin,也就是使pmin指向函数min,C语言中,函数名称代表函数的首地址
printf("Please input two integer number:\n");
scanf("%d,%d",&a, &b);
m = (*pmin)(a, b);//由于pmin指向了函数min的首地址,所以这句话完全等效于min(a,b)
printf("min = %d\n",m);
return 0;
}
/********************************************
Please input two integer number:
2,6
min = 2
Press any key to continue
**********************************************/
</pre><pre name="code" class="cpp">
</pre><pre name="code" class="cpp">
当把int(*pmin)(int ,int)里面的参数省略时,发生如下错误
error C2440: '=' : cannot convert from 'int (__cdecl *)(int,int)' to 'int (__cdecl *)(void)
其原因是调用的函数min的参数是两个形参,使用函数的指针时也必须要指出里面的参数个数,可以省略参数的名称,所以程序中用的(int,int)
注意:
(1) 指向函数的指针变量的一般定义形式为:
数据类型 (*指针变量名)(函数参数列表)
这里数据类型就是函数返回值的类型
(2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的,而只是表示定义这样一个类型的变量,它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的,且有两个整形参数)的地址赋给它,他就指向哪一个函数。在一个函数中,一个函数指针变量可以先后指向同类型的不同函数。
(3) p = max; 在给函数指针变量赋值时,只需给出函数名而不必给出函数参数,因为是将函数的入口地址赋给 p ,而不涉及 实参和形参的结合问题,不能写成 p = max(a,b);
(4) c = (*p)(a,b) 在函数调用时,只需将( *p ) 代替函数名即可,后面实参依旧。
(5) 对于指向函数的指针变量,像 p++ ,p+n.....是无意义的。
注意事项1-5是取自:http://www.cnblogs.com/zxl2431/archive/2011/03/25/1995285.html