函数指针

1 篇文章 0 订阅

         函数指针是指向函数的指针变量。 因而函数指针“本质是指针变量,只不过该指针变量指向函数。在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,我们就可以用指针变量调用函数,就如同用指针变量可引用其他类型变量一样。函数指针有两个用途:调用函数和做函数的参数。

        函数指针的声明方法为:

        函数返回类型  (标识符指针变量名)(形参列表);

        注意:(标识符指针变量名)的括号不能省,若省略则成为一个指针函数的声明;后面的形参列表表示指针变量指向函数所带的参数列表。

       例:int functionint a)//声明一个函数

              int*funptr)(int a);//声明一个函数指针

              funptr=function//function函数的首地址赋给指针funptr

         赋值时,函数function不带括号,也不带参数。经过赋值后,指针funptr就指向函数functionint a)的代码的首地址。

#include<stdio.h>

int max(int x,int y)
{
        return(x>y?x:y);
}
int main()
{
    int (*p)(int, int);
    int a,b,c;
    p=max;
    scanf("%d%d",&a,&b);
    c=(*p)(a,b);//p(a,b)也可以
    printf("a=%d,b=%d,max=%d",a,b,c);
}
      p是指向函数的指针变量,所以可把函数max()赋给p作为p的值,即把max()的入口地址赋给p,就可以用p来调用该函数,实际上p和max都指向同一个入口地址,不同就是p是一个指针变量,不像函数名称那样是死的,它可以指向任何函数。在程序中把哪个函数的地址赋给它,它就指向哪个函数。而后用指针变量调用它,因此可以先后指向不同的函数。不过注意,指向函数的指针变量没有++和--运算。

       typedef的使用:

      1、定义函数指针类型:

      typedef int*funptr)(int x,int y);

      2、声明变量和赋值:

      funptrmax_fun=max;

#include<stdio.h>

int max(int x,int y)
{
        return(x>y?x:y);
}
int main()
{
    typedef int(*funptr)(int x,int y);
    int a,b,c;
    funptr max_fun=max;
    scanf("%d%d",&a,&b);
    c=(*max_fun)(a,b);
    printf("a=%d,b=%d,max=%d",a,b,c);
}
      typedef的功能是定义新的类型。第一句就是定义了一种funptr的类型,并定义这种类型为指向某种函数的指针,这种函数以一个(int,int)为参数并返回int类型。后面就可以像使用int,char一样使用funptr了。


        函数指针数组

        函数指针数组是一个其元素是函数指针的数组。函数指针数组声明与函数指针声明差不多,就是变量变成了数组。

       函数指针数组声明: int  (*funs[2])(int a,int b);    

#include "stdio.h"
int add(int a,int b){return a+b;}
int minus(int a,int b){return a-b;}
int main()
{
    int a=1,b=2;
    int (*funs[2])(int a,int b);
    funs[0]=add;
    funs[1]=minus;
    printf("%d %d\n",funs[0](a,b),funs[1](a,b));
    return 0;
}
        函数指针数组的赋值与一般数组一样,有两种方式:静态定义和动态赋值。

       1、 静态定义:

        int   (*funs[ ])(void)={fun1,fun2,fun3};

       2、动态赋值

        int   (*funs[3 ])(void);

       funs[0]=fun1;

       funs[2]=fun2;

       funs[2]=fun3;

    
   




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值