1、首先打开vs2014,新建一个项目。
2、添加头文件。
3、添加main主函数。
4、定义一个函数addTwoNumbers。
5、将addTwoNumbers函数地址赋值给ptr_sum。
6、调用函数指针求和。
7、运行程序,看看结果。
注意事项:
因此“函数指针”本身首先应是指针变量,只不过该指针变量指向函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。
函数指针的使用过程包含三个步骤:
1、定义一个函数指针;
2、将函数指针指向一个函数;
3、调用这个函数指针所指向的函数。
下面给一个例子加以说明:
int add(int one, int another)
{
return one + another;
}
int sub(int one, int another)
{
return one - another;
}
int rev(int n)
{
return -n;
}
// 先定义3个函数,分别完成加法、减法和求相反数。这样只是为了说明问题的方便。
void main(void)
{
int result;
int (*p)(); // 这样定义指向函数的指针
// 应说明如下问题:
// 1、这里的()绝对不能少;
// 2、前面的int类型应该和这个指针未来要指向的函数的返回值类型保证一致。
p = add;
// 这个操作是最需要说明的。
//1、add是函数名称;
//2、函数名称本质上是一个函数的入口地址常量,或者换句话说,函数名称是指向函数的指针常量(函数名称实质上是这个函数的代码和数据在内存中的首地址);
//3、将函数名称赋值给一个函数指针,就实现了将一个函数指针指向这个函数的作用。实际上,这时的指针变量里存储的就是那个函数的第一条指令的地址。
result = p(3, 4); // 也可以写成:result = (*p)(3, 4);
// 这里依然有几个问题需要说明:
// 有初学者对这里很不理解,认为p是指针名称,不是函数名称,怎么能调用add()函数呢?实际上,问题是这样的:
// “XXXX(...)”这种形式的内容被C语言编译系统这样理解:
// 要调用一个函数,而且这个函数的首地址由XXXX确定;对应的汇编指令主要是:CALL XXXX
// 由于p的值就是函数首地址(函数第一条指令的地址),因此,p()就是在调用地址值为p的值的函数。
p = sub; // 让p指向sub()函数
result = p(6, 2); // 调用sub()函数
p = rev; // 让p指向rev()函数
result = p(5); // 调用rev()函数
}
一般需要定义一个函数指针类型
typedef int (*function_pointer_t) ( int arg1, int arg2 );
然后,定义函数指针变量
function_pointer_t fp_invoker = 0;
函数指针可以动态改变内容,改变调用对象,假设有两个函数
int function_sum( int arg1, int arg2 )
{
return arg1+arg2;
}
int function_sub( int arg1, int arg2 )
{
return arg1-arg2;
}
注意到两个函数的原型与函数指针类型是一致的。以下是调用
fp_invoker = function_sum; // 直接用函数名赋值即可
fp_invoker(1,2); // 调用时,可以认为函数指针便是函数名,此时调用加法
fp_invoker = function_sub; // 同理,切换到减法
fp_invoker(1,2); // 调用减法
以上都是直观的用法,通常函数指针用于回调,即下层函数先将函数指针内容保存起来,处理结束后,再调用。此时要注意首先检查函数指针内容是否为空。
if( fp_invoker ){
fp_invoker( arg1, arg2 );
}