简介:
程序中需要处理的数据都保存在内存空间,而程序以及函数同样也保存在内存空间支持通过函数的入口地址(指针)访问函数。另一方面,有些函数在编写时要调用其他的辅助函数,但是尚未确定,在具体执行时,再为其传递辅助函数的地址。比如排序函数sort(a,an,cmp),其中的比较函数cmp是根据需要传递给sort的,就是传递了一个函数指针。
函数指针就是指向函数的指针变量,定义格式如下:
类型名(*函数名)(参数);
例如,“int(*f)(int a,int b);",规范来说,此处的“函数名”应该称为“指针的变量名”。
例1:
#include <iostream>
using namespace std;
int add(int a,int b)
{
return a+b;
}
int main()
{
cout<<add<<endl;//或者&add,输出函数的地址
int (*f) (int a,int b);//声明一个指向函数的指针变量
f=add;//或者&add,将函数add的入口地址传给f
cout<<f(5,5)<<endl;//调用函数
cout<<(*f)(10,10)<<endl;
return 0;
}
输出如下:
使用函数指针需要注意以下几点:
1)定义函数指针要与函数原型一致。例如函数为
int test(int);",则函数指针声明为“int(*f)(int);“
2)获取函数的地址有两种方式:一种是直接使用函数名,如add或者f=test;另一种是使用取地址符,如&add或者f=&add;
3)调用函数有两种方式:一种是直接使用函数名如f(5);另一种是使用函数指针调用函数,如(*)f(5);
4)函数指针还支持一种结合typedef的定义方式,例如:
#include <iostream>
using namespace std;
int add(int a,int b)
{
return a+b;
}
typedef int (*addp) (int,int);
int main()
{
addp f=add;
cout<<f(2,3)<<endl;
return 0;
}
输出如下:
5)可以定义一个数组存放多个函数指针。这样的数组称为“函数指针数组有菜单选择功能的程序,相对 switch或者if语句,使用更加灵活,代码更加简洁。
例2:
【问题描述】
输入两个正整数m和n,再输入一个代表运算方案的数字k:1代表求m+n的值;2代表求m-n的值;3代表求mn的值;4代表求m/n的值整除)。请函数指针数组编程模拟计算器,输出相应的运算结果。
【输入格式】
第1行为2个正整数m和n;
第2行为1个正整数k,1≤k≤4
【输出格式】
一行一个整数,表示相应的运算结果。
【输入样例】
6 8
1
【输出样例】
14
【问题分析】
本题用函数指针来实现,程序相对简洁一些。
#include <iostream>
using namespace std;
int oper1(int a,int b)
{
return a+b;
}
int oper2(int a,int b)
{
return a-b;
}
int oper3(int a,int b)
{
return a*b;
}
int oper4(int a,int b)
{
return a/b;
}
typedef int (*f) (int a,int b);
int main()
{
int m,n,k;
f a[4]={oper1,oper2,oper3,oper4};
while(cin>>m>>n>>k)
{
cout<<a[k-1](m,n)<<endl;
}
return 0;
}
测试样例如下: