注冊(cè) 登錄
Office中國(guó)論壇/Access中國(guó)論壇 返回首頁(yè)

ganlinlao的個(gè)人空間 http://m.mzhfr.cn/?230471 [收藏] [復(fù)制] [分享] [RSS]

日志

FreeBasic中的指針基礎(chǔ)入門(mén)四----指針函數(shù)與函數(shù)指針——冬瓜湯整理

已有 3248 次閱讀2014-10-2 18:13 |個(gè)人分類(lèi):FreeBasic| Freebasic的指針函數(shù), Freebasic的函數(shù)指針

8、指針函數(shù)

指針函數(shù)是指返回值是指針的函數(shù),即本質(zhì)是一個(gè)函數(shù)。當(dāng)一個(gè)函數(shù)聲明其返回值為一個(gè)指針時(shí),實(shí)際上就是返回一個(gè)地址給調(diào)用函數(shù)以用于需要指針或地址的表達(dá)式中。

格式:

Dim 函數(shù)名(參數(shù))as 類(lèi)型說(shuō)明符 ptr

當(dāng)然了,由于返回的是一個(gè)地址,所以類(lèi)型說(shuō)明符一般是integer.

(FBinteger32位中等價(jià)于long,64位中等價(jià)于longint。而long不管是32位或64位都是固定32位。所以我個(gè)人常用integer來(lái)表示指針。這個(gè)IntegerVBA中的integer數(shù)值大小范圍是完全不一樣的,切記)

如:

Dim GetDate() as integer ptr

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

函數(shù)返回的是一個(gè)地址值,經(jīng)常使用在返回?cái)?shù)組的某一元素地址上。

9、函數(shù)指針

FreeBasic在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類(lèi)型變量一樣,在這些概念上是一致的。

函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。

指向函數(shù)的指針包含了函數(shù)的地址,可以通過(guò)它來(lái)調(diào)用函數(shù)。

聲明格式如下:

聲明符 函數(shù)指針變量名 As function (參數(shù))

函數(shù)指針的聲明和它指向函數(shù)的聲明應(yīng)保持一致。

如:

聲明一個(gè)無(wú)參數(shù)的sub過(guò)程的函數(shù)指針

Dim Ptrsub as sub

聲明一個(gè)帶參數(shù)的function的函數(shù)指針

如:

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

把函數(shù)的地址賦值給函數(shù)指針,可以采用下面兩種形式:

Fptr=@Function

Fptr=Procptr(Function)

注意,指向函數(shù)的指針變量沒(méi)有++--運(yùn)算,用時(shí)要小心。

賦給函數(shù)指針的函數(shù)應(yīng)該和函數(shù)指針?biāo)傅暮瘮?shù)原型是一致的 

如何調(diào)用函數(shù)指針?

如:

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)              /’直接把參數(shù)傳給函數(shù)指針'/ 

函數(shù)指針如何做為函數(shù)或過(guò)程的參數(shù)?

接上面的例子:

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               聲明一個(gè)帶函數(shù)指針參數(shù)的函數(shù)

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

另一種寫(xiě)法:把函數(shù)指針用type定義成一個(gè)結(jié)構(gòu)類(lèi)型

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、指針的指針

指針的指針看上去有些令人費(fèi)解。它們的聲明有兩個(gè)ptr。例如:

Dim ptrMystring as string ptr ptr

如果有三個(gè)ptr,那就是指針的指針的指針,四個(gè)ptr就是指針的指針的指針的指針,依次類(lèi)推。當(dāng)你熟悉了簡(jiǎn)單的例子以后,就可以應(yīng)付復(fù)雜的情況了。當(dāng)然,實(shí)際程序中,一般也只用到二級(jí)指針,三級(jí)指針不常見(jiàn),更別說(shuō)四級(jí)指針了。

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

    Dim c as string=”hello,world” 

    Dim P as string ptr =@c 

    Dim cp as string ptr ptr=@P

通過(guò)指針的指針,不僅可以訪問(wèn)它指向的指針,還可以訪問(wèn)它指向的指針?biāo)赶虻臄?shù)據(jù)。下面就是幾個(gè)這樣的例子:

    Dim ptrP as string ptr=*cp   P的地址賦值給ptrP

    Print **cp                打印c的內(nèi)容即”hello,world”

說(shuō)明:指針取值*運(yùn)算是從右到左的順序

你可能想知道這樣的結(jié)構(gòu)有什么用。利用指針的指針可以允許被調(diào)用函數(shù)修改局部指針變量和處理指針數(shù)組。 

11、指向指針數(shù)組的指針。(這個(gè)用處不多,在此略過(guò))

 

12、函數(shù)指針數(shù)組

函數(shù)指針數(shù)組就是函數(shù)指針的數(shù)組,函數(shù)指針數(shù)組是一個(gè)其元素是函數(shù)指針的數(shù)組。那么也就是說(shuō),此數(shù)據(jù)結(jié)構(gòu)是一個(gè)數(shù)組,且其元素是一個(gè)指向函數(shù)入口地址的指針。使用方法類(lèi)似與普通的數(shù)組

Freebasic中,無(wú)法直接聲明一個(gè)函數(shù)指針的指針變量。應(yīng)該用type先把函數(shù)指針定義成一個(gè)結(jié)構(gòu)類(lèi)型。然后再聲明函數(shù)指針的指針變量。

例子:

Function Halve (ByVal i As Integer) As Integer     一個(gè)普通的函數(shù)

    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先把函數(shù)指針定義成一個(gè)結(jié)構(gòu)類(lèi)型

接下來(lái)定義一個(gè)函數(shù)指針數(shù)組,用Null作為數(shù)組的結(jié)尾符 ’/

Dim operations(20) As operation = _

{ @Halve, @Triple, 0 } 

Dim i As Integer = 280

Dim op As operation Ptr = @operations(0)  定義一個(gè)指針變量指向函數(shù)指針數(shù)組首地址

While (*op <> 0)   

    i = (*op)(i)          必須用括號(hào)把*op括起來(lái),因?yàn)?/span>*取值的運(yùn)算順序低于函數(shù)的()

    op += 1

Wend

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

評(píng)論 (0 個(gè)評(píng)論)

facelist doodle 涂鴉板

您需要登錄后才可以評(píng)論 登錄 | 注冊(cè)

QQ|站長(zhǎng)郵箱|小黑屋|手機(jī)版|Office中國(guó)/Access中國(guó) ( 粵ICP備10043721號(hào)-1 )  

GMT+8, 2025-7-13 03:11 , Processed in 0.055846 second(s), 17 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

返回頂部