C/C++中的指针函数与函数指针,以及函数指针在回调函数和函数指针数组中的应用

首先,我们先要明确一点,函数指针是一个指针,只不过这个指针指向的对象有些特殊,是一个函数。指针函数是一个函数,只不过函数的返回值是一个指针。

 

一、指针函数,指针函数的一般定义格式是:

类型* 函数名(形参列表)

{

      语句块;

      return 返回值;

}

举个例子如下:

#include <stdio.h>

#include <string.h>

char* fun(char p[],int n)

{   

   char *buf;

   buf = p; 

   return buf;

}

int main()

{

   char str[]="pointer";

   printf("%s",fun(str,strlen(str)));

   return 0;

}

编译及运行结果如下

 

二、函数指针

       1.函数指针的定义格式:

          返回类型 (*函数指针名)(形参类型列表);//注:可以没有形参类型列表,但要有 () 表示形参类型及个数在赋值时决定

          例如:int (*fun)(int);  这就定义了一个指向返回值为int型,形参为int型的函数的函数指针 fun

        2.函数指针的赋值:

              有这么一个和fun指针匹配的函数fun1,那么它的赋值为:fun = fun1;

       int fun1(int n)

      {

          printf("%d\n",n);

          return 0;

       }

       

      3.函数指针的一个应用是回调函数,下面我们定义俩个不同的.cpp文件,实现一个回调函数

       第一个文件fs.cpp  

/*NULL的头文件*/

#include <stddef.h>

extern int fun1(int n);

int(*g_funp)(int)=NULL;

int fun(int(*funp)(int n))

{

  fun1(100);

  g_funp = funp;

  return 0;

}

第二个文件test.cpp

#include <stdio.h>

#include <string.h>

/*回调函数*/

extern int fun(int (*funp)(int n));

int fun1(int n)

{

   printf("%d\n",n);

   return 0;

}

int main()

{

   fun(fun1);

   return 0;

}

编译及运行结果如下:

程序分析:

 main函数调用fun函数,并传递一个函数指针fun1,在fun函数中又去回调fun1函数,其中在fs.cpp文件中又定义了一个函数指针g_funp,并在fun中将传过来的参数赋值给它,目的是以后能在fs.cpp中其他函数中调用这个fun1(当然这个是在fun1定义成static时的一种处理,fun1如果没有定义成static时直接使用extern声明调用即可),一般函数指针在linux中的写法常是被封装成结构体的一个成员,然后在传参的时候把整个结构体传过去,接着再去处理函数指针这个成员。

4.函数指针的另一个应用,函数指针数组

      对于有多个函数调用时,正常我们会通过输入的编号结合switch case去调用对应的函数,那么当函数个数十分庞大时就         使用switch case的效率就十分低了,为此我们引入函数指针数组

举个例子如下:

#include <stdio.h>

int add(int a,int b)
{
    return a+b;
}

int dec(int a,int b)
{
    return a-b;
}

int seq(int a)
{
    return a*a;
}

int main()
{
   /*因为函数的参数个数既有一个的也有俩个的所以定义成()这种形式*/
    int (*funparry[3])()={add,dec,seq};
    int i=0,data1=0,data2=0,ret; 
    while(1)
    {
      printf("0. add\n");
      printf("1. dec\n");
      printf("2. seq\n");
      printf("select number\n");
      scanf("%d",&i);
      if(i==2)
      {
          printf("input data1\n");
          scanf("%d",&data1);
          ret = funparry[i](data1);
      }
      else
      {
          printf("input data1 and data2\n");
          scanf("%d %d",&data1,&data2);
          ret = funparry[i](data1,data2);
      }
      printf("result is %d\n",ret);
    }

   return 0;
}

执行结果如下:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Rookie Linux

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值