u012410984
wlgemini
采纳率100%
2013-11-17 03:55

c语言中函数指针作为参数与函数的嵌套

已采纳

函数指针作为另一函数的参数和函数的嵌套的区别,感觉都是调用,有什么不一样呢?他们都适用在什么情况下!(我是在学非递归遍历二叉树时看到的)
Status Visit(TElemType e){
printf("%c\n",e);
return OK;
}
Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e)){
SqStack S; InitStack(S); Push(S,T); SElemType p;
while (!StackEmpty(S)){
while(GetTop(S,p)&&p) Push(S,p->lchild);
Pop(S,p);
if(!StackEmpty(S)){
Pop(S,p); if(!Visit(p->data)) return ERROR;
Push(S,p->rchild);
}//if
}//while
return OK;
}
这里边Visit是函数指针,而SqStack和InitStack是嵌套,他们都不都是在调用吗?为什么在InOrderTraverse的参数中不再加上SqStack和InitStack呢,或者将参数*Visit去掉直接调用呢?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答

  • DoctorCZM 寧靜以致遠 8年前

    您好,针对这个问题
    Status InOrderTraverse(BiTree T ,Status(*Visit)(TElemType e))函数中第2个参数是一个指向函数的指针,这样做的目的是为了程序的灵活性。试想如果给你一个整型数100,要求分别按照10进行、16进制输出,你可以写一个输出10进制函数与输出16进制函数,当你有需要输出16进制时,只需要将16进制函数地址传给Visit就行,而不需要改变InOrderTraverse函数,这种做法灵活,也符合软件工程编程思想。

    另外,InitStack(S); 就是函数调用,这种就在InOrderTraverse已经写死了,如果有几种初始化情况的话,就得在InOrderTraverse增加判断条件来加以区分,这样增加了代码量。

    希望我的回答对您帮助!

    点赞 2 评论 复制链接分享
  • whizer whizer 8年前

    C语言中没有所谓的函数嵌套....只有函数调用一说...

    SqStack应该是一种类型,InitStack是初始化这种类型...

    C语言的函数调用,只要被调函数对可见,就可以调用.

    建议你看看<>这本书.

    点赞 评论 复制链接分享

相关推荐