什么是函数指针
函数指针指向某种特定类型,函数的类型由其参数及返回类型共同决定,与函数名无关,个人理解所谓的函数指针其实是我们回调函数的一种指针的表现形式,类似于传递对象,当我们获取到该对象之后就可以调用这个对象中的函数/过程
下面看一个例子
定义类型:
简单的说是将这种形式的函数定义成一种类型,然后我们通过这种类型来定义一个变量,该变量的值是一个函数,我们在调用该变量的时候其实就是在调用该变量指向的函数,从而达到动态调用函数的目的(其实我更愿意说是回调)
type
IntProc = procedure (var Num: Integer);
type
IntProc = procedure (var Num: Integer);
定义实例函数
这些函数叫什么名字无所谓,这些函数将来都是用于给我们之前定义的函数类型进行赋值的具体指,但是参数列表和返回值的类型必须和之前定义的函数类型一致
procedure DoubleTheValue (var Value: Integer);
begin
Value := Value * 2;
end;
调用代码
var
IP: IntProc;
X: Integer;
begin
IP := DoubleTheValue;
X := 5;
IP (X);
end;
很显然这种调用方法比直接调用麻烦很多,那么我们为什么要用这种方式呢?
因为在某些情况下,调用什么样的函数需要在实际中(运行时)决定,你可以根据条件来判断,实现用同一个表达,调用不同的函数,很是灵活.
实现回调机制
虽然现在大家都在讲面向对象,但是如果能够很好的掌握利用函数指针,在我们编写代码的时候也是我们的一大助力
再来一个例子,我们将一个函数指针作为函数的参数,通过传递不同的实例函数来实现不同函数的调用
type
//函数指针
TFunctionParameter = function(const value : integer) : string;
//函数-实例1
function One(const value : integer) : string;
begin
result := IntToStr(value) ;
end;
//函数-实例2
function Two(const value : integer) : string;
begin
result := IntToStr(2 * value) ;
end;
//定义将要使用动态函数指针参数的函数
function DynamicFunction(f : TFunctionParameter; const value : integer) : string;
begin
result := f(value) ;
end;
上面这个动态函数的使用实例
var
s : string;
begin
s := DynamicFunction(One,2006) ;
ShowMessage(s) ;
s := DynamicFunction(Two,2006) ;
ShowMessage(s) ;
end;
通过上面的例子大概能够看出,我们在调用DynamicFunction函数时传递了两个参数,第一个是我们真实的函数(我们可以称为函数实例),第二个参数是我们给了给函数实例传递的数据
今天的内容到此结束,理论的东西我可以帮大家整理,代码实践只能靠自己了,永远不要指望某一个老师或者某几部教程能够解决你所有的问题
写在最后:纸上得来终觉浅,觉知此事需躬亲!与君共勉!