今天在学习数据结构中遇到一些问题,函数的指针不知道怎么用,给自己科普一哈
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 是个函数指针的指针。