@指针、Cardinal()、Integer()、指针取值解析

指針本身只是一個編號(即也是一個地址),它還要指向一個地址。故它存储的內容是個地址!

假设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;

 stringpchar很特殊,以后研究。。。。。

 

 

 

 

 

 

 

posted @ 2021-04-15 17:09  枭二熊  阅读(158)  评论(0)    收藏  举报