記憶體中的資料除了 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程式執行後, 字串所在的記憶體基本上是下面這個樣子(以位元組為單位), 上例中的 n 標識著 ↓ 的位置: ↓astr: string;
n: cardinal;
pstr: pstring;
begin
str := 'abcde';
n := cardinal(str);
pstr := @str;
showmessage(inttostr(n));
showmessage(inttostr(cardinal(pstr)));
showmessage(pstr^);
end;
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 型別,也就是可以指向任何型別資料的指標...