请问下面这个程序里对形参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)) 展开
{ /* 初始条件:顺序线性表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)) 展开
展开全部
你理解的没有问题,其实这两种方式都可以以。这个在《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和指针》中的讲解,可以下一本电子书看一下,有关指针那一章。自己可以写一个简短的例子,测试一下,上述内容是否正确
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询