函数指针:

    指向函数的指针, 首先是一个指针, 这个指针指向一个函数。

    函数具有可赋值给指针的物理内存地址,一个函数的函数名就是一个指针,它指向函数的代码。一个函数的地址是该函数的进入点,也是调用函数的地址。函数的调用可以通过函数名,也可以通过指向函数的指针来调用。函数指针还允许将函数作为变元传递给其他函数。

    不带括号和变量列表的函数名,这可以表示函数的地址,正如不带下标的数组名可以表示数组的首地址。

定义形式:

类型 (*指针变量名)(参数列表);

例如:

    int (*p)(int i,int j);

    p是一个指针,它指向一个函数,该函数有2个整形参数,返回类型为int。p首先和*结合,表明p是一个指针。然后再与()结合,表明它指向的是一个函数。指向函数的指针也称为函数指针。

例1:

      #include <stdio.h>

      #define GET_MAX 0
      #define GET_MIN 1

      int get_max(int i,int j)
      {
        return i>j?i:j;
      }

      int get_min(int i,int j)
      {
        return i>j?j:i;
      }

      int compare(int i,int j,int flag)
      {
        int ret;

        //这里定义了一个函数指针,就可以根据传入的flag,灵活地决定其是指向求大数或求小数的函数
        //便于方便灵活地调用各类函数
        int (*p)(int,int);

        if(flag == GET_MAX)
          p = get_max;
        else
          p = get_min;

        ret = p(i,j);

        return ret;
      }

      int main()
      {
        int i = 5,j = 10,ret;

        ret = compare(i,j,GET_MAX);
        printf("The MAX is %d\n",ret);

        ret = compare(i,j,GET_MIN);
        printf("The MIN is %d\n",ret);

        return 0 ;
      }

    例2:

      #include <stdio.h>
      #include <string.h>

      void check(char *a,char *b,int (*cmp)(const char *,const char *));

      int main()
      {
        char s1[80],s2[80];
        int (*p)(const char *,const char *);

        //将库函数strcmp的地址赋值给函数指针p
        p=strcmp;

        printf("Enter two strings.\n");
        gets(s1);
        gets(s2);

        check(s1,s2,p);
      }

      void check(char *a,char *b,int (*cmp)(const char *,const char *))
      {
        printf("Testing for equality.\n");
        //表达式(*cmp)(a,b)调用strcmp,由cmp指向库函数strcmp(),由a和b作调用strcmp()的参数。
        //调用时,与声明的情况类似,必须在*cmp周围使用一对括号,使编译程序正确操作,
        //同时这也是一种良好的编码风格,指示函数是通过指针调用的,而不是函数名。
        if((*cmp)(a,b)==0)
          printf("Equal\n");
        else
          printf("Not Equal\n");
      }

    例3:

      #include <stdio.h>
      #include <ctype.h>
      #include <stdlib.h>
      #include <string.h>

      //check()函数的第3个函数是函数指针,就可以根据具体情况传入不同的处理函数
      void check(char *a,char *b,int (*cmp)(const char *,const char *));

      //自定义的比较两个字符串的函数
      int compvalues(const char *a,const char *b);

      int main()
      {
        char s1[80],s2[80];

        printf("Enter two values or two strings.\n");
        gets(s1);
        gets(s2);

        //如果是数字,则用函数指针传入数字比较函数进行处理
        if(isdigit(*s1))

        {
          printf("Testing values for equality.\n");
          check(s1,s2,compvalues);
        }
        //如果是字符串,则用函数指针传入库函数strcmp进行处理
        else

        {
          printf("Testing strings for equality.\n");
          check(s1,s2,strcmp);
        }
      }

      void check(char *a,char *b,int (*cmp)(const char *,const char *))
      {
        if((*cmp)(a,b)==0)
          printf("Equal.\n");
        else
          printf("Not Equal.\n");
      }

      int compvalues(const char *a,const char *b)
      {
        if(atoi(a)==atoi(b))
          return 0;
        else
          return 1;
      }

---------------------
作者:str999_cn
来源:CSDN
原文:https://blog.csdn.net/str999_cn/article/details/78591369
版权声明:本文为博主转载,若有侵权请联系本人删除

指向函数的指针 ------ 函数指针(function pointer)的更多相关文章

  1. 类非静态成员的函数指针 的使用 Function pointer of a non-static member function of a class

    you can get the pointer of the method, but it has to be called with an object typedef void (T::*Meth ...

  2. C 函数与指针(function & pointer)

    C 函数与指针(function & pointer) /* * function.c * 函数在C中的使用 * */ #include <stdio.h> int noswap( ...

  3. 指针函数(Pointer Function)和函数指针(Pointer to Function或Function Pointer)

    一.指针函数 1.解释:指针函数很好理解:简单来说,就是一个返回指针的函数,本质是一个函数.如: int fun(int x,int y);    //这是一个普通函数的声明,返回值是一个int类型, ...

  4. 返回指针的函数 ------ 指针函数(pointer function)

    指针函数: 其本质是一个函数, 其函数返回值为某一类型的指针. 定义形式: 类型 *指针变量名(参数列表): 例如: int *p(int i,int j); p是一个函数名,该函数有2个整形参数,返 ...

  5. typedef 函数指针 数组 std::function

    1.整型指针 typedef int* PINT;或typedef int *PINT; 2.结构体 typedef struct { double data;}DATA,  *PDATA;  //D ...

  6. c++指向指针的指针与 c++指针作为函数参数传递问题

    一直搞不明白,c++中指针到底是个啥东西,今天遇到到c++,指向指针的指针的问题,突然有点开窍了. 举个例子: int main(int argc, char** argv){ int a[5]={1 ...

  7. c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind

    一.符号修饰与函数签名 1.符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名.GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 ...

  8. C++ 必知必会:条款16 指向成员函数的指针并非指针

    这一点与指向成员的指针类似,其实现可能更加复杂,因为成员函数同时还存在虚拟函数,需要动态绑定执行动作.当然这种属性是属于函数本身的,此处表达的是指针不涉及函数的属性问题. 1: class shape ...

  9. 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a

    题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...

随机推荐

  1. TCP三次握手--syn攻击

    TCP握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接.第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确 ...

  2. 对于get系列className的不兼容

    function getClass(param){ if(id.getElementsByClassName){ return id.getElementsByClassName(param); }e ...

  3. “Nested exception: 前言中不允许有内容"错误处理

    最近在做一个小项目,使用org.dom4j.DocumentHelper.parseText方法时一直报错”Nested exception: 前言中不允许有内容",这个parseText解 ...

  4. Html 标签种类

    Html 标签种类 自闭合标签与闭合标签 自闭合标签 <标签 /> 闭合标签 <标签></标签> 块级标签与行内标签 浏览器审查元素使用: (1) f12 查看每个 ...

  5. javascript监听按键

    document.addEventListener('keydown',test); function test(e){ var x=e.keyCode; if(x == 49){ console.l ...

  6. 腾讯云centos7.2安装jdk1.7 tomcat7.0部署项目示例

    说实话win server的性能并不好,所以程序员必须会在Linux上安装环境,部署项目. 第一步,官网下载tomcat和jdk压缩文件*.tar.gz  下载路径如下: jdk:http://www ...

  7. 彻底删除windows残留启动引导

    在win7/Win8系统下安装其他系统或者一键重装系统后,安装的系统删除或者一键重装文件删除了,在windows启动管理器中还残留了启动引导选项,影响开机效率. 在系统配置中有些"引导&qu ...

  8. Harbor私有仓库中如何彻底删除镜像释放存储空间?

    简介: Harbor私有仓库运行一段时间后,仓库中存有大量镜像,会占用太多的存储空间.直接通过Harbor界面删除相关镜像,并不会自动删除存储中的文件和镜像.需要停止Harbor服务,执行垃圾回收命令 ...

  9. inline-block间隙问题总结, ,style一个样式后面 多加了一个 分号; 导致 样式失效

    1--- 样式最后的{}后面, 不能有分号 ; 2---- display:inline-block 后, 元素间会有间隙    原因:  由换行或者回车导致的. 解决一: 只要把标签写成一行或者标签 ...

  10. ES6标准之基础

    let和const命令 ES6新增let命令,用于声明变量,是块级作用域. let声明的变量不会像var声明的变量发生“变量提升”现象,所以,变量一定要在声明后使用,不然就会报错. 暂时性死区:只要块 ...