现在的位置: 首页 > 综合 > 正文

函数指针小记

2012年03月20日 ⁄ 综合 ⁄ 共 1057字 ⁄ 字号 评论关闭

 在此之前,我先简要说一下程序在内存中的分配问题。在一个程序运行时,我们可以简单的吧内存分为四个部分:代码区(Code Area),全局数据区(Data Area),堆区(Heap Area),和栈区(Stack Area)。其中程序运行时对数据的处理放在代码区,定义的普通变量放在栈区,全局变量和静态变量(包括全局和局部)放在全局数据区,堆区用来存放动态数据(主要由new,malloc等函数定义)。

        有了这些基本知识,现在可以开始讲解了。其实说白了,函数名表示的就时一个地址,如果你很熟悉数组的话,就会很好理解,函数名同数组名一样,都起着一个标号的作用,既然是标号,就具有地址的属性。因此,我们在以后学习函数中遇到不理解的地方大可以与数组名的概念比较一下。但是它们之间还时有些不同的地方。如数组前的类型名如:int ,char等,实际上时告诉程序在对数组的存取中以多少个内存单元为单位一起处理。举个例子:在16位机上,以个整型变量占2个字节,程序在对这个变量进行操作时就两个两个字节的取值。而函数前的类型名表示函数的返回值,它的赋值实际上时由return语句决定的,注意这里我们用的时*赋值*,而不是什么传递,因为局部变量的生存时间在函数的“}”结束时就结束了,所返回的值实际上时临时开辟的内存空间(全局变量除外),因此我们不能把指针指向它,这样做是很危险的,因为临时数据的不知道什么时候就会被其他数据覆盖掉,如果后来对指针的操作破坏了栈区的一些重要数据,如其他调用函数的返回地址,就有可能造成程序的崩溃。

关于函数指针,可以简单的表示为:int (* fun) (char a,char b,……);,如果我们用typedef语句对它进行定义的话,如:typedef int (*fun) (char a,char b,……);他表示一个指向返回值为int,有形如char a,char b参数的函数,我们可以用它来定义一个类型的指针,fun ptr1,ptr2;他们都有着与fun一样的属性,其实这很好理解,我们只要把函数之战看成简单的诸如:int之类的变量就行了,同样的我们也可以把它作为返回参数如我们已有这样的定义:typedef int(* FUN)();   那么返回函数指针的函数表达式就应该形如: FUN fun(int ,char);定义为函数的返回值,返回是函数指针。

这时我们若把FUN与int类比一下就会很好理解了。我之所以总是强调类比,因为在程序学习中类比时个非常重要的学习方法,可以充分的举一反三,让你的学习变的非常轻松。

抱歉!评论已关闭.