注册 登录
Office中国论坛/Access中国论坛 返回首页

ganlinlao的个人空间 http://www.office-cn.net/?230471 [收藏] [复制] [分享] [RSS]

日志

FreeBasic中的指针基础入门四----指针函数与函数指针——冬瓜汤整理

已有 2999 次阅读2014-10-2 18:13 |个人分类:FreeBasic| Freebasic的指针函数, Freebasic的函数指针

8、指针函数

指针函数是指返回值是指针的函数,即本质是一个函数。当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数以用于需要指针或地址的表达式中。

格式:

Dim 函数名(参数)as 类型说明符 ptr

当然了,由于返回的是一个地址,所以类型说明符一般是integer.

(FBinteger32位中等价于long,64位中等价于longint。而long不管是32位或64位都是固定32位。所以我个人常用integer来表示指针。这个IntegerVBA中的integer数值大小范围是完全不一样的,切记)

如:

Dim GetDate() as integer ptr

Dim AAA(a as string,b as long) as integer ptr

函数返回的是一个地址值,经常使用在返回数组的某一元素地址上。

9、函数指针

FreeBasic在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是一致的。

函数指针有两个用途:调用函数和做函数的参数

指向函数的指针包含了函数的地址,可以通过它来调用函数。

声明格式如下:

声明符 函数指针变量名 As function (参数)

函数指针的声明和它指向函数的声明应保持一致。

如:

声明一个无参数的sub过程的函数指针

Dim Ptrsub as sub

声明一个带参数的function的函数指针

如:

Function Add(a as integer,b as integer) as integer

Return a+b

End function

Dim PtrAdd as Function(as integer,as integer) as integer=@add

把函数的地址赋值给函数指针,可以采用下面两种形式:

Fptr=@Function

Fptr=Procptr(Function)

注意,指向函数的指针变量没有++--运算,用时要小心。

赋给函数指针的函数应该和函数指针所指的函数原型是一致的 

如何调用函数指针?

如:

Function Add(a as integer,b as integer) as integer

Return a+b

End function

Dim PtrAdd as Function(as integer,as integer) as integer=@add

Print “3+4 =” & ptrAdd(3,4)              /’直接把参数传给函数指针'/ 

函数指针如何做为函数或过程的参数?

接上面的例子:

Function mynewfunction(a as integer,b as integer,ptrAdd as function(as integer,as integer) as integer) as integer

Return ptrAdd(a,b)

End function               声明一个带函数指针参数的函数

Print “3+4=” & mynewfunction(3,4,@add)

另一种写法:把函数指针用type定义成一个结构类型

Type PtrAdd as Function(as integer,as integer) as integer

Function mynewfunction(a as integer,b as integer,myPtradd as ptrAdd) as integer

Print “3+4=” & mynewfunction(3,4,@add)

 

10、指针的指针

指针的指针看上去有些令人费解。它们的声明有两个ptr。例如:

Dim ptrMystring as string ptr ptr

如果有三个ptr,那就是指针的指针的指针,四个ptr就是指针的指针的指针的指针,依次类推。当你熟悉了简单的例子以后,就可以应付复杂的情况了。当然,实际程序中,一般也只用到二级指针,三级指针不常见,更别说四级指针了。

指针的指针需要用到指针的地址。

    Dim c as string=”hello,world” 

    Dim P as string ptr =@c 

    Dim cp as string ptr ptr=@P

通过指针的指针,不仅可以访问它指向的指针,还可以访问它指向的指针所指向的数据。下面就是几个这样的例子:

    Dim ptrP as string ptr=*cp   P的地址赋值给ptrP

    Print **cp                打印c的内容即”hello,world”

说明:指针取值*运算是从右到左的顺序

你可能想知道这样的结构有什么用。利用指针的指针可以允许被调用函数修改局部指针变量和处理指针数组。 

11、指向指针数组的指针。(这个用处不多,在此略过)

 

12、函数指针数组

函数指针数组就是函数指针的数组,函数指针数组是一个其元素是函数指针的数组。那么也就是说,此数据结构是一个数组,且其元素是一个指向函数入口地址的指针。使用方法类似与普通的数组

Freebasic中,无法直接声明一个函数指针的指针变量。应该用type先把函数指针定义成一个结构类型。然后再声明函数指针的指针变量。

例子:

Function Halve (ByVal i As Integer) As Integer     一个普通的函数

    Return i / 2

End Function

 

Function Triple (ByVal i As Integer) As Integer

    Return i * 3

End Function

 

Type operation As Function (ByVal As Integer) As Integer   /‘ type先把函数指针定义成一个结构类型

接下来定义一个函数指针数组,用Null作为数组的结尾符 ’/

Dim operations(20) As operation = _

{ @Halve, @Triple, 0 } 

Dim i As Integer = 280

Dim op As operation Ptr = @operations(0)  定义一个指针变量指向函数指针数组首地址

While (*op <> 0)   

    i = (*op)(i)          必须用括号把*op括起来,因为*取值的运算顺序低于函数的()

    op += 1

Wend

Print "Value of 'i' after all operations performed: " & i

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-4-19 14:10 , Processed in 0.171931 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回顶部