談談 Delphi 的型別與指標 2

2021-09-05 18:36:00 字數 3126 閱讀 8136

記憶體中的資料除了 0 便是 1, 你把它當作、字元、數字等等, 那是你的事, 記憶體只認識 0 和 1.

win32 系統除了使用硬記憶體以外, 還可以從硬碟上開闢虛擬記憶體;

因為 win32 的記憶體位址範圍在 4 個 g 以內(0..2

32-1), 所以它最多能夠給乙個應用程式分配 4g 的執行空間; 並且其中的 2g 有系統管理, 實際上程式只有 2g 的自主空間. 還記得有說 string 最大長度是 2g 嗎? 就是這個道理.

有 4g 的記憶體, 就有 4g 個位址, 也就是最多可以有 (1024*1024*1024*4 - 1 = 4294967295) 個記憶體位址, 這剛好是 delphi 中 cardinal 的最大值, 所以 32 位的指標型別追到底都是 cardinal 型別的乙個數字.

乙個記憶體位址是 0..4294967295 之間的乙個數字, 你可以通過記憶體位址讀取或寫入資料;

乙個指標要用來索引或標識記憶體, 它也是 0..4294967295 之間的乙個數字; 它們雖不相同, 但通過指標可以找到實際儲存資料的記憶體位址, 並按指定的型別去讀寫它.

譬如:

var

str: string;

n: cardinal;

pstr: pstring;

begin

str := 'abcde';

n := cardinal(str);

pstr := @str;

showmessage(inttostr(n));

showmessage(inttostr(cardinal(pstr)));

showmessage(pstr^);

end;

程式執行後, 字串所在的記憶體基本上是下面這個樣子(以位元組為單位), 上例中的 n 標識著 ↓ 的位置: ↓a

bcde

換二進位制圖示一下:

↓00001010

00001011

00001100

00001101

00001110

如果只看二進位制, 這個資料到底是什麼很難知道; 再說它為什麼非得是字串 "abcde" 呢? 這可不一定.

下面的例子中, 我們先是權且把它當作字串, 但隨著指標的移動, 字串也在變化.

然後, 有分別把它分別用 byte 指標(pbyte) 和 integer 指標(pinteger) 去讀取它, 也會得到相應的值.

完整示例如下:

unit unit1;

inte***ce

uses

windows, messages, sysutils, variants, classes, graphics, controls, forms,

dialogs, stdctrls;

type

tform1 = class(tform)

button1: tbutton;

button2: tbutton;

button3: tbutton;

procedure button1click(sender: tobject);

procedure button2click(sender: tobject);

procedure button3click(sender: tobject);

end;

var form1: tform1;

implementation

procedure tform1.button1click(sender: tobject);

var str: string;

ps: pchar;

n: cardinal;

begin

str := 'abcde';

ps := pchar(str);

n := cardinal(ps);

//n := cardinal(str);

showmessage(inttostr(n));

showmessage(pchar(n));

showmessage(pchar(n+1));

showmessage(pchar(n+2));

showmessage(pchar(n+3));

showmessage(pchar(n+4));

end;

procedure tform1.button2click(sender: tobject);

var str: string;

n: cardinal;

pb: pbyte;

begin

str := 'abcde';

n := cardinal(str);

showmessage(inttostr(n));

pb := pbyte(n);

showmessage(inttostr(pb^));

pb := pbyte(n+1);

showmessage(inttostr(pb^));

end;

procedure tform1.button3click(sender: tobject);

var str: string;

n: cardinal;

pint: pinteger;

begin

str := 'abcde';

n := cardinal(str);

showmessage(inttostr(n));

pint := pinteger(n);

showmessage(inttostr(pint^));

pint := pinteger(n+1);

showmessage(inttostr(pint^));

end;

end.

上面的第三個程式段的結果或許讓你迷惑:

第乙個結果, 應該和 "abcd" 有點關係才對啊, 怎麼是: 1145258561 ?

第二個結果, 應該和 "bcde" 有點關係才對啊, 怎麼是: 1162101570 ?

為什麼呢? 這當然沒錯, 聽我解釋:

1145258561 轉換成十六進製制是: 44434241, 寫得清楚一點是: $44 $43 $42 $41; 還記得 intel 等當下流行的 cpu 安排資料是倒著的嗎?

Delphi 的型別與指標

談談 delphi 的型別與指標 1 先宣告 不要把我說的這些個東西當作教科書,這都是自己的淺見 同時希望得到指正.delphi 的指標分為 型別指標 和 無型別指標 兩類.delphi 中的型別,常用的也得有幾百個,我們可以給每種型別定義相應的型別指標.其實 delphi 已經為很多態別預定義了指...

Delphi 的型別與指標

先宣告 不要把我說的這些個東西當作教科書,這都是自己的淺見 同時希望得到指正.delphi 的指標分為 型別指標 和 無型別指標 兩類.delphi 中的型別,常用的也得有幾百個,我們可以給每種型別定義相應的型別指標.其實 delphi 已經為很多態別預定義了指標,譬如資料型別 integer 有對...

C與DELPHI指標型別

一 型別指標的定義。對於指向特定型別的指標,在c中是這樣定義的 int ptr char ptr 與之等價的object pascal是如何定義的呢?varptr integer ptr char 其實也就是符號的差別而已。二 無型別指標的定義。c中有void 型別,也就是可以指向任何型別資料的指標...