2 u012410984 u012410984 于 2013.11.17 11: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
DoctorCZM   2013.12.23 11:29
已采纳

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

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

希望我的回答对您帮助!

whizer
whizer   2013.11.29 13:52

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

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

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

建议你看看<>这本书.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!