函数指针的理解 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 是个函数指针的指针。

猜你喜欢

转载自www.cnblogs.com/CheeseIce/p/10575077.html
今日推荐