• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

XiaoXiaoli

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

c_函数指针

函数名本质上就是函数指针(函数名就是一个地址)。

 

函数指针的定义方式

  先定义出函数类型,再通过类型定义函数指针

  typedef void (FUNC_TYPE) (int, char );

  FUNC_TYPE *pFUNC;

 

  定义出函数指针类型,再通过类型定义函数指针变量

  typedef void (*FUNC_TYPE) (int, char );

  FUNC_TYPE pFUNC;

 

  直接定义函数指针变量

  void (*pf) (int, char)

 

函数指针最常见的两个用途

  (1)转换表(jump table)

  (2)函数指针作为参数传递给另一个函数。

 

声明一个函数指针,并不能马上使用,在使用之前必须将其初始化指向某个函数。

初始化函数指针的方法:

int f(int);
int (*pf)(int) = &f;

 第二个声明创建了函数指针pf,并把它初始化指向函数f。

&可以省略,因为函数名会被编译器解释为函数指针。

 

函数指针被声明并且初始化后,我们就有三种方式调用。

int ans;
ans = f(25);
ans = pf(25);
ans = (*pf)(25);

第一种方式通过名字调用函数f,函数名f首先被转换为一个函数指针,该指针指定函数在内存中的位置。然后函数调用操作符调用该函数,执行开始于这个地址的代码。

第二种方式,直接使用函数指针调用。

第三种方式,对pf执行间接访问操作。

 

 

回调函数

这里有一个简单的函数,它用于在一个单链表中查找一个值。它的参数是指向链表第一个节点的指针以及需要查找的值。

Node * search_list(Node *node, int const value)
{
        while(node != NULL)
        {
              if(node->value == value){
                  break;
              }  
              node = node->link;
        }
        return node; 
}        

  

使用这种技巧的函数叫做回调函数(callback function)。因为用户把一个函数指针作为参数传递给其他函数,后者将“回调”用户的函数。

 

案例:  

  提供一个函数,实现对任意类型的数组进行排序,排序规则利用选择排序,排序顺序由用户自己决定。

 

  提供一个函数,可以打印任何数据类型。

    (1)函数的参数

        一个指向任何数据类型的指针(void *),一个函数指针。

    (2)通过函数指针调用用户自己提供的函数。

 

  提供一个函数,可以打印任何类型的数组。

 

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

/*打印任何数据类型
 *
 * */
typedef int (*PRINTTYPE)(void *);

int printData(void *pi, PRINTTYPE type){
        int i_ret = 0;
        i_ret = type(pi);
        if(i_ret)
        {
                printf("函数调用失败");
                return -1;
        }
        return 0;
}

int myself_printInt(void *p1){
        int *i = p1;
        printf("%d\n", *i);
        return 0;
}

int myself_printDouble(void *p2){
        double *d = p2;
        printf("%.2lf\n", *d);
        return 0;
}

int main(void){
        int i = 10;
        double d = 90002.98;
        printData(&i, myself_printInt);
        printData(&d, myself_printDouble);
        return 0;
}

  

 

 

  

 

posted on 2021-08-07 17:37  XiaoXiaoli  阅读(62)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3