指針本身只是一個編號(即也是一個地址),它還要指向一個地址。故它存储的內容是個地址!
假设pstr是一个字符指针(PString)类型的指针变量:pstr:PString;
则:
1.@pstr可以取得指针本身的地址值。
2.Cardinal(pstr)、Integer(pstr)、pstr 都可以取得指针里面存储的那个地址值,区别在于,前2个取得的地址值是十进制(用%d展示),最后那个取得的地址值是十六进制(用%p展示)。
3.pstr^可以取得指针里储存的地址的字符值。
procedure TForm1.Button3Click(Sender: TObject);
var
ss,s1,s2:string;
Cardinal1:Cardinal;//Cardinal和Longword一樣是4字節32位無符號整數,範圍都是0~4294967295。
pstr:PString;
//指針本身只是一個編號(即也是一個地址),它還要指向一個地址。故它的內容是個地址!
begin
ss:='ABCD';
ShowMessageFmt('%p , %p',[@ss,@Cardinal1]);//0018F580,0018F574
Cardinal1:=Cardinal(ss);//變量Cardinal1存儲的是ss字符串的起點位置!因為'位置'是一個0~4294967295之間的數字,所以能賦給Cardinal1變量。
//Cardinal1:=Cardinal(ss[1]);//65
//Cardinal1:=Cardinal(ss[2]);//66
//Cardinal1:=Cardinal(ss[3]);//67
//Cardinal1:=Cardinal(ss[4]);//68
ShowMessageFmt('%p , %p',[@ss,@Cardinal1]);//0018F580,0018F574
pstr:=@SS;//pstr指向ss這個字符串的位置。
{問:'Cardinal1=%d'表示啥? 表示ss的字符串的起點位置??
答:Cardinal1按%d來讀取其本身時,不同時刻得到的值是會變的,如4533116、4533028等,
說明它表示一個地址值。}
s1:=Format('Cardinal1=%d,Cardinal1本身的地址為:%p, pstr儲存的內容為:%p',[Cardinal1,@Cardinal1,pstr]);//Cardinal1是個變量,所以能用@取它的地址。
s2:=Format('Cardinal1里的SS的值為:%s,pstr本身的地址為(@pstr):%p,pstr儲存的內容為(Cardinal(pstr)):%d,pstr儲存的內容為(Integer(pstr)):%d,pstr儲存的內容為:%p,pstr的值為:%s',[PString(@Cardinal1)^,@pstr,Cardinal(pstr),Integer(pstr),pstr,pstr^]);
{要取到Cardinal1 裡面的ss的值的話,要這樣寫:PString(@Cardinal1)^ ,其中,
@Cardinal1是取到Cardinal1的地址,PString()是將該地址轉化為PString類型的指針,
PString()^ 是取到該指針的值。}
ShowMessage(s1);//'Cardinal1=4533140,Cardinal1本身的地址為:0018F574, pstr儲存的內容為:0018F580'
ShowMessage(s2);//'Cardinal1里的SS的值為:ABCD,pstr本身的地址為(@pstr):0018F570,pstr儲存的內容為(Cardinal(pstr)):1635712,pstr儲存的內容為(Integer(pstr)):1635712,pstr儲存的內容為:0018F580,pstr的值為:ABCD'
end;
string和pchar很特殊,以后研究。。。。。