美文网首页
1.C++程序设计——函数指针

1.C++程序设计——函数指针

作者: 徐凯_xp | 来源:发表于2021-02-18 15:19 被阅读0次

    基本概念

    • 程序运行期间,每个函数都会占用一段连续的内存空间
    • 函数名就是该函数所占内存区域的起始地址(入口地址)
    • 可以将函数的入口地址赋给指针变量,使该指针变量指向该函数,通过指针变量就可以调用这个函数
    • 这种指向函数的指针变量被称为“函数指针”

    定义形式

    • 类型名(* 指针变量名)(参数类型1,参数类型2,......)
    int (*pf)(int , char); //pf为一个函数指针,它所指向的函数的返回值是int,2个参数一个是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);
      int x = 4, y = 5;
      pf = PrintMin;
      pf(x,y);
      return 0;
    }
    //pf指针指向PrintMin
    
    

    qsort库函数

    • 对数组排序,需要知道
      • 数组起始地址
      • 数组元素个数
      • 每个元素的大小(从而得出每个元素的地址)
      • 元素谁前谁后的规则
    void qsort(void *base, int nelem, unsigned int width, int(* pfCompare)(const void*,const void*));
    //base:待排序数组的起始地址
    //nelem:待排序数组的元素个数
    //width:待排序数组的每个元素的大小(以字节为单位)
    //pfCompare:比较函数的地址
    //pfCompare:函数指针,它指向一个“比较函数”,该比较函数的形式如下
    //int 函数名 (const void * elem1,const void * elem2);
    //比较函数是程序员自己编写的
    
    • 排序就是一个不断比较并交换位置的过程
    • qsort函数在执行期间,会通过pfCompare指针调用“比较函数”,调用时将要比较的两个元素的地址传给“比较函数”,然后根据“比较函数”返回值判断哪个应该排在前面
    • 比较函数编写规则
      • 如果*elem1应该在前,函数返回负整数
      • 如果*elem2应该在前,函数返回正整数
      • 如果无所谓前后,函数返回0
    • 实例
      • 功能:调用qsort库函数,将一个unsigned int数组按照个位数从小到大进行排序
    #include <stdio.h>
    #include <stdlib.h>
    
    int MyCompare(const void * elem1,const void * elem2)
    {
      unsigned int * p1, * p2;
      p1 = (unsigned int *) elem1; //"*elem1" 非法,编译器不知道void指针指向的元素有多少个字节
      p2 = (unsigned int *) elem2; //"*elem2" 同上
      return (*p1 % 10) - (*p2 % 10);
    }
    #define NUM 5
    int main()
    {
      unsigned int an[NUM] = (8,123,11,10,4);
      qsort(an,NUM,sizeof(unsigned int),MyCompare);
      for(int i=0;i<NUM;i++)
        printf("%d",an[i]);
      return 0;
    }
    

    相关文章

      网友评论

          本文标题:1.C++程序设计——函数指针

          本文链接:https://www.haomeiwen.com/subject/xutnxltx.html