Addr、@运算符与Pointer类型
?? ?如果在Delphi IDE中輸入Addr然后按F1的話,幫助文件會(huì)告訴你:Addr是個(gè)返回值類型為Pointer的函數(shù)。不過(guò)我個(gè)人更傾向叫它運(yùn)算符,因?yàn)樵谀J(rèn)編譯條件下,它的行為和@運(yùn)算符別無(wú)二致。函數(shù)和運(yùn)算符有哪些區(qū)別和特點(diǎn),我是如何對(duì)它們進(jìn)行定義的,會(huì)在其它文章中講到。
?? ?Delphi中的Pointer類型與C中的void*類型是一模一樣的,它可以與任何類型的指針、對(duì)象、類變量進(jìn)行相互轉(zhuǎn)換,并且編譯器不會(huì)給出任何警告(印象中C++中會(huì)要求從void*向其它類型轉(zhuǎn)換時(shí)進(jìn)行顯式轉(zhuǎn)換,否則會(huì)給出警告)。指針類型的空值是nil,與Pointer(0)或Ptr(0)是完全相同的。在Delphi中,甚至你可以直接把0賦值給任何一個(gè)指針,而編譯器僅僅是給你個(gè)警告,告訴你已經(jīng)把0變成nil了(在Free Pascal中則會(huì)出錯(cuò))。直接對(duì)Pointer類型的變量進(jìn)行解引用,得到的“值”的類型是“不定類型(Untyped Type? 這個(gè)似乎有點(diǎn)兒黑色幽默,我回頭找找看有沒(méi)有確定的翻譯 -_-)”,它不能直接賦值給任何變量(除作為參數(shù)傳遞給要求不定類型的函數(shù),相關(guān)知識(shí)會(huì)在講參數(shù)時(shí)詳細(xì)介紹)。關(guān)于Pointer類型就暫時(shí)先介紹這么多了,更加詳細(xì)的會(huì)放在介紹指針的文章中。
?? ?那么,我現(xiàn)在再?gòu)?qiáng)調(diào)一下前面介紹的兩個(gè)特點(diǎn):
?? ?現(xiàn)在,根據(jù)這兩個(gè)條件,很容易得到如下推論:當(dāng)使用Addr運(yùn)算符、或是默認(rèn)編譯條件下的@運(yùn)算符時(shí),我們可以把一個(gè)變量的地址賦值給另外一種類型的指針變量。舉例來(lái)說(shuō),就是:
var { Global vars }I : Integer;PS : PSingle = @I;PC : PChar = Addr(I);?? ?可以編譯一下上面的代碼,默認(rèn)編譯參數(shù)下是完全沒(méi)問(wèn)題的。
?? ?對(duì)于一個(gè)初學(xué)者來(lái)說(shuō),可能指針類型對(duì)還是比較神秘的。這種“錯(cuò)誤”的類型轉(zhuǎn)換可能會(huì)給您帶來(lái)很大的麻煩,出現(xiàn)意想不到的錯(cuò)誤,并且很難調(diào)試。但如果您和我一樣,眼里全是地址與數(shù)據(jù)沒(méi)有類型,類型只是為了在運(yùn)算的時(shí)候規(guī)定編譯器的行為,那么Addr與默認(rèn)編譯條件下的@運(yùn)算符的這個(gè)特點(diǎn),卻是Delphi非常方便的一個(gè)特性。
?? ?如果細(xì)心的話,可能您已經(jīng)注意到,在提到@運(yùn)算符時(shí),我都會(huì)在前面加上一個(gè)限定詞——默認(rèn)編譯條件,而在提到Addr時(shí)則沒(méi)有任何修飾。這就引出了本文的另外一個(gè)重要知識(shí)點(diǎn):沒(méi)錯(cuò)兒,可以改變編譯條件,從而使@運(yùn)算符與Addr運(yùn)算符表現(xiàn)出不同的行為。
在IDE中,可以通過(guò)Project Options -> Compiler,勾上“Typed @ operator”,或是通過(guò)預(yù)編譯指令$T+或$TYPEDADDRESS ON,來(lái)改變@運(yùn)算符的行為。這樣設(shè)置之后,上面代碼中使用@I行就會(huì)出現(xiàn)一個(gè)編譯錯(cuò)誤,提示Single與Integer是不同的類型。
而Addr運(yùn)算符的行為則不會(huì)改變,這意味著編譯器認(rèn)為,當(dāng)你使用Addr時(shí)知道自己在做什么。
?? ?對(duì)于初學(xué)者來(lái)說(shuō),如果對(duì)指針類型的使用沒(méi)把握的話,建議打開這個(gè)選項(xiàng),可以在一定程度減少出錯(cuò)的可能性。
轉(zhuǎn)載于:https://www.cnblogs.com/egust/archive/2010/08/02/1790342.html
總結(jié)
以上是生活随笔為你收集整理的Addr、@运算符与Pointer类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 一颗心只为你情侣网名81个
- 下一篇: ExtJs-GridPanel简单的增删