使用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;
雖然說很簡單,但是在這裡先記下來,防止以後遺忘!
《重來》值得你多看幾遍
作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...
《重來》值得你多看幾遍
作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...
《重來》值得你多看幾遍
作者崇尚簡約 見解獨到 看法新穎 內容有點另類,卻總讓我產生共鳴,從中受到不少啟發,看起來真是過癮。原來書還可以這樣寫。有些可能不知不覺加上了我自己的觀點,同一句話不同的人有不同的理解,可能會出現斷章取義的情況,往你喜歡的方面想就好,這是唯一一本我在幾天之內看了兩遍的書,我想很多人也會喜歡,於是昨晚...