函数指针及拓展

简介:
程序中需要处理的数据都保存在内存空间,而程序以及函数同样也保存在内存空间支持通过函数的入口地址(指针)访问函数。另一方面,有些函数在编写时要调用其他的辅助函数,但是尚未确定,在具体执行时,再为其传递辅助函数的地址。比如排序函数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;
}

测试样例如下:
在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值