请问下面这个程序里对形参Status(*compare)(ElemType,ElemType)的使用是不是错的?

intLocateElem(SqListL,ElemTypee,Status(*compare)(ElemType,ElemType)){/*初始条件:顺序线性表L已存在... int LocateElem(SqList L,ElemType e,Status(*compare)(ElemType,ElemType))
{ /* 初始条件:顺序线性表L已存在,compare()是数据元素判定函数(满足为1,否则为0) */
/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0。算法2.6 */
ElemType *p;
int i=1; /* i的初值为第1个元素的位序 */
p=L.elem; /* p的初值为第1个元素的存储位置 */
while(i<=L.length&&!compare(*p++,e))
++i;
if(i<=L.length)
return i;
else
return 0;
}

函数compare定义在另一个文件里:
Status compare(ElemType c1,ElemType c2) /* c1等于c2 */
{
if(c1==c2)
return TRUE;
else
return FALSE;
}

Status(*compare)(ElemType,ElemType))形参是不是指向函数的指针?
我觉得如果Status(*compare)(ElemType,ElemType))是指向函数的指针 ,
那么在使用时应该是把 while(i<=L.length&&!compare(*p++,e))
改成 while(i<=L.length&&!(*compare)(*p++,e))
展开
 我来答
子同1989
推荐于2017-09-22 · TA获得超过256个赞
知道小有建树答主
回答量:90
采纳率:0%
帮助的人:100万
展开全部

你理解的没有问题,其实这两种方式都可以以。这个在《c和指针》这本书上有讲解。这本书上大体是这样讲的

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

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

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

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

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

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

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

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

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

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

 

这是《c和指针》中的讲解,可以下一本电子书看一下,有关指针那一章。自己可以写一个简短的例子,测试一下,上述内容是否正确

bnulzm
2013-06-28 · TA获得超过264个赞
知道小有建树答主
回答量:190
采纳率:100%
帮助的人:199万
展开全部
Status(*compare)(ElemType,ElemType)) 定义的是一个函数指针啊
Status compare(ElemType c1,ElemType c2)是一个真实的函数
别弄混淆了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式