zoukankan      html  css  js  c++  java
  • 函数指针的理解 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 是个函数指针的指针。

  • 相关阅读:
    51Nod 1119 机器人走方格 V2 组合数学 费马小定理
    Codeforces Round #439 div2 869A The Artful Expedient +869B The Eternal Immortality
    51Nod 1050 循环数组最大子段和 dp
    51Nod 1009 数字1的数量 数位dp
    51Nod 1082 与7无关的数 暴力打表(埃氏筛的感觉)
    POJ 2001 Shortest Prefixes
    字典树模板
    HDU 1251 统计难题
    kmp算法模板
    HDU 2087 剪花布条
  • 原文地址:https://www.cnblogs.com/CheeseIce/p/10575077.html
Copyright © 2011-2022 走看看