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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言中“指针”作为“函数参数”时的注意事项
C语言中“指针”作为“函数参数”时的注意事项
C语言中指针变量作为函数参数和一般变量作为函数参数的区别
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。指针变量作为函数参数和一般变量作为函数参数是有区别的,对于这种区别初学者一般都很迷惑。下面我将就一个简单的例子来说明一下它们的区别。看透以后也许也就不那么疑惑了。# include void main(){ void swap1(int a,int b); void swap2(in
用指针处理C语言中不定数目的函数参数
用指针处理C语言中不定数目的函数参数cybra_shaoxing@163.com现在我们每编一个程序几乎都会用到两个函数-printf和scanf。发现这两个函数和普通函数的不同之处了吗?那就是这两个函数都可以处理不定数目的实参。C语言是一种很宽松的语言,它甚至允许程序员对函数传递任意数目的参数。而这个特性在某些情况下是非常有用的。比如,现在我们要编一个求一系列整数平均值的函数averag
关于将函数的地址作为参数传递给另一个函数调用
1.在讲这个问题之前,我们要明白一个问题。就是我们为什么要把一个函数的地址作为参数传递给另一个参数。要知道在C语言中,一个函数内部是可以直接调用其他函数的,既然可以直接调用,为什么还要用这么麻烦的办法去把函数当做参数来传递呢。下面我举个例子。 例如我们设计一个estimate() 的函数计算一个程序运行的时间,但不同的人估算时间的时候可能算法有所不同,算出的时间也应该不同。但我们都调用同一个es
C语言中函数指针的简单使用
本文的主要内容目录: 一、函数指针的引入 二、函数指针的简单运用 一、函数指针的引入 在C语言当中,指针的使用非常重要的。我们都知道有变量指针,可以通过这个变量指针来访问这个变量;那么有没有函数指针呢,如果有的话能不能通过这个函数指针来访问这个函数呢?答案是肯定的。在说什么是函数指针之前,先引入一个简单的例子,如下所示: #include /* 打印Hello,world!
C语言中数组名作为参数进行函数传递
C语言中数组名作为参数进行函数传递在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译系统分配的两个不同的内存单元。在函数调用时发生的值传送是把实参变量的值赋予形参变量。在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?在我们曾介绍过,数组名就是数组的首
Go语言学习六:指针与传递到函数的指针
package main import ( "fmt" ) const MAX int = 3 func main() { var a int = 20 var ip *int /* 声明指针变量 */ ip = &a ip = &a /* 指针变量的存储地址 */ fmt.Printf("a 变量的地址是: %x\n", &a) /* 指针变量的存储地址 */ fm
C语言可变参数函数的使用方法讲解
http://blog.chinaunix.net/uid-21736802-id-1817658.html 本文主要介绍可变参数的函数使用,然后分析它的原理,程序员自己如何对它们实现和封装,最后是可能会出现的问题和避免措施。   VA函数(variable argument function),参数个数可变函数,又称可变参数函数。C/C++编程中,系统提供给编程人员的va函数很少。
【嵌入式开发】C语言 命令行参数 函数指针 gdb调试
① C语言程序的命令行参数解析 以及 可选参数解析 ② 函数指针详解 , 对复杂的函数指针解析 ③ 解析复杂的函数声明 ④ gdb调试工具的使用
C/C++:使用函数指针作为参数,完成不同的任务
1、通过typdef关键字指定函数指针