函数指针

定义形式

类型名 (*指针变量名)( 参数类型1 ,参数类型2)

int (*pf)(int ,char )

表示pf是一个函数指针,它所指向的函数,返回值应该是int类型,该函数有两个参数,一个是int类型,一个是char类型。

可以用一个原型匹配的函数的名字给一个函数指针赋值,要通过函数指针调用它所指向的函数,写法为:
函数指针名(实参表)

#include<stdio.h>
void PrintMin( int a ,int b)
{
    if(a<b)
        printf("%d",a);
    else
        printf("%d",b);    
}
int main()
{
    void (*pf)(int ,int );
     //定义的(*pf)函数与PrintMin都是void类型且参数都为int类型所以他们匹配了
    int x=4,y=5;
    pf=PrintMin;
    pf(x,y);
    return 0;
}

输出结果为:4

我们直接使用函数名调用不就可以了,为啥要用函数指针呢?

我们都知道,程序=数据结构+算法,
在没有C++语言的年代,没有面向对象、模板的语法支持,struct中还不能定义函数,用C语言想要对业务功能(算法,此处即指函数)进行抽象,不想依赖具体的数据结构/数据类型,此时就必须用指向函数的指针来实现抽象与具体的分离(该函数的入参可以是void*,这样调用者就可以传入任意类型的参数了)。后来有了C++,就用类成员函数和泛型(模板+functor)来代替了,这样做有更强的静态类型检查机制和编程约束,有利于减少滥用风险。
(函数指针的一个典型应用场合是实现回调。为什么要回调?就是因为此时还不知道具体函数定义,事件发生时才调用、才确定;类比于面向对象中的“多态”+设计模式中的“观察者模式”,回调的实质仍然是抽象)
那为什么C++中还有类的成员函数指针?因为C与C++中间还有个版本,C with Class(1980’s),此时还没把模板吸收进来,想实现成员函数级抽象还得靠函数指针。后来C++标准出来了,为了兼容老代码,况且在某些场合下使用起来还是比较灵活、轻量级的(虽然语法比较丑陋),成员函数指针就被保留下来了。
综上,C语言的函数指针有两层含义:
1. 意味着这是对一个类的操作,其实就是成员函数。(对于全局的成员函数,给它脑补一个虚拟的“全局类”就好了)
2. 意味着该成员函数对数据类型信息不做明确规定,它只是个处理引擎,具体的数据类型由调用者在使用的时候确定二者有其一的场合,就可以用函数指针。

注解:
void * fun( ) ; //声明一个返回值是任意类型的指针的函数fun()
void vfun( ) ; //声明一个没有返回值的函数vfun()
void (*)( )  //这是一种变量类型,可用来定义函数指针变量,如:
void (*pfun)( ) ; //声明一个函数指针变量pfun,该类型函数就是void vfun( ) 这种类型,pfun可以指向这类函数,如:pfun=vfun ;
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值