多看幾遍就能夠對Delphi或者指標有多一點的理解

2021-09-30 09:23:59 字數 1456 閱讀 4469

使用dephi使用指標的頻率不會像c那麼高,但是確實也會使用,特別是操作vmt的時候,下面是根據vmt的一些知識寫的乙個程式片段,在寫出來之後,結合自己的理解,進行了比較詳細的注釋,在注釋的過程中,對於所寫的內容有了更加清晰的認識。

procedure tform1.btn1click(sender: tobject);

var iinstancesize: integer;

s: string;

ap: pointer;

tmp: pointer;

tmp2: pointer;

begin

//獲取物件指標

ap := self;

//ap^代表取出ap中儲存位址處的內容,此處仍然是乙個指標,故寫作pointer(ap^)

//此時的ap中儲存的已經是vmt的首位址

ap := pointer(ap^);

//嘗試取下instanceszie

//移動後到達乙個位址,這裡面儲存的是instancsize所在的位址,先轉化為乙個無型別指標

//由於已知,這個指標中儲存的位址處存放的是乙個integer型別,因此可以進行如下操作

tmp2 := pointer(integer(ap) + vmtinstancesize);

//由於已知,這個指標中儲存的位址處存放的是乙個integer型別,因此可以進行如下操作

showmessage(format('%d', [integer(tmp2^)]));

//下面這句是上面步驟的簡化版

showmessage(format('%d', [integer(pointer(integer(ap) + vmtinstancesize)^)]));

//下面是這句是上面的精簡版

iinstancesize := (pinteger(integer(ap) + vmtinstancesize)^);

showmessage(format('%d;real instance size:%d; class name:%s', [iinstancesize, self.instancesize, self.classname]));

//類似上面的方式,可以取得乙個字串型別classname

tmp := pointer(integer(ap) + vmtclassname);

//tmp在上一句已經轉化為乙個指向classname的指標。

//由於字串是用乙個指標指向的,不是立即儲存的,因此,下面先將 tmp存放的是指向字串指標的首位址,因此,

//根據該首位址取出字串的首位址

tmp := pointer(tmp^);

//下面是將記憶體的首位址轉化為乙個固定型別的指標,隨之取出內容

showmessage(pshortstring(tmp)^);

end;

雖然說很簡單,但是在這裡先記下來,防止以後遺忘!

《重來》值得你多看幾遍

作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...

《重來》值得你多看幾遍

作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...

《重來》值得你多看幾遍

作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...