• 函数指针的理解 from 数据结构


    今天在学习数据结构中遇到一些问题,函数的指针不知道怎么用,给自己科普一哈
     1 int LocateElem_Sq(SqList L, LElemType_Sq e, Status(*Compare)(LElemType_Sq, LElemType_Sq))
     2 {
     3     int i = 1;                            //i的初值为第一个元素的位序
     4     int * p = L.elem;                    //p的初值为第一个元素的存储位置
     5     while(i<=L.length && !(*Compare)(*p++,e))
     6         ++i;
     7 // 也可以写作   while(i<=L.length && !Compare(e, L.elem[i-1]))
     8     //    ++i;
     9 
    10     if(i<=L.length)
    11         return i;
    12     else
    13         return 0; 
    14 }
     

    /*

    Status(*compare)(ElemType,ElemType))形参是不是指向函数的指针

    Status(*compare)(ElemType,ElemType)) 定义的是一个函数指针

    Status compare(ElemType c1,ElemType c2)是一个真实的函数

    */

    简单谈谈我对函数指针的理解

    假设我现在定义一下指针和函数

    1 int f(int);//函数f有两个形参,返回值为整型
    2 int (*pf)(int);//指向函数的指针

    对于pf的赋值可以有以下两种方式

    1 1)pf = &f
    2 2)pf = f//常用方式

    对于1)初始化表达式中的&操作符是可选的。因为函数名使用时总是由编译器把它转换为函数指针。&操作符只是显示地说明了编译器将隐式执行的任务。

    可以使用以下方式调用函数

    1 int ans;
    2 1)ans = f(24);//假设给函数传递的参数是24
    3 2)ans = (*pf)(24);//严蔚敏那版数据结构中的代码采用这种方法,还有大部分国内的c语言教材也是采用这种写法
    4 3)ans = pf(24);//《c和指针》这本书中通用的写法,我认为这种写法好理解一些

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

    2)对于of执行间接访问操作,它把函数指针转换为一个函数名,然后执行与1)相同的操作

    3)因为pf是函数的地址,这里就省略了转换过程。

    例子:

    1 int (*p)(int);

    我们知道 (*p)(int) 是个整数,所以, *p 是个 返回整数的函数。而p就是指向这种函数的指针

    1 int (**p)(int);

    (**p)(int)是个整数。 **p 是个函数,返回一个整数。于是 *p 是个函数的指针。 p 是个函数指针的指针。

  • 相关阅读:
    053573
    053572
    053571
    053570
    053569
    053568
    Android:你好,androidX!再见,android.support
    最新Androidx Fragment的前世今生系列(一)之Fragment的简单使用
    Android开发中如何匹配layout资源(layoutsw480dp layoutsw600dpland layoutsw720dpport)
    Android:Fragment最全面介绍 & 使用方法解析
  • 原文地址:https://www.cnblogs.com/CheeseIce/p/10575077.html
Copyright © 2020-2023  润新知