||
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.
(在FB中integer在32位中等價(jià)于long,在64位中等價(jià)于longint。而long不管是32位或64位都是固定32位。所以我個(gè)人常用integer來(lái)表示指針。這個(gè)Integer跟VBA中的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
|站長(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.