怎樣才能訪問pointer指針的所有數(shù)據(jù)?(最好有多種方法一起說明) 例: var p:pointer begin p:=一個指針變量 p:=p+1;//為什么不能這樣使用?怎樣才能指向下一個地址? end; var p: pointer; s: string; begin s:= 'abc'; p:= PChar(s); //給指針賦值 p:= Pointer(Integer(p)+1); //把指針后移一位 Caption:= string(Char(p^)); //讀取后移后的指針內容 end; 我有這樣一段代碼 var Pos: Byte; PP: PByte;
Pos := 1 PP := PP + Pos; PP^ := 12;
在這三句話中Delphi老是說第二句有錯誤,我知道如果寫成這樣是沒有問題的PP【Pos】 := 12; 但是有時候就是感覺和C的不一樣,不習慣(一直是用C做底層的東東,改了太難受了,呵呵) Delphi 里面的Integer 和 Pointer, 0 和 nil前兩天,一個同事問我關于Delphi里面Pointer的問題,便和他一起推敲, 結果發(fā)現(xiàn)一個有趣的結論:Delphi里面, nil = 0; 想想,這也是很好理解的, 在32位Windows操作系統(tǒng)里面, 一個整數(shù)是32位, 一個指針也是32位的無符號整數(shù)。 但是,具體編程上的操作,卻比較有趣, 各位老大請看:vara : Pointer;begin// a := nil;if Assigned(a) thenbegin ShowMessage('我有種')endelse begin ShowMessage('我沒種')endend; 結果是:'我有種', 說明Pointer和Integer一樣,聲明后,必須初始化。再看下面:vara : Pointer;begina := 0;if Assigned(a) thenbeginShowMessage('我有種')endelse begin ShowMessage('我沒種')endend; 結果是:'我沒種', 說明對于Pointer,nil其實就是等于這個Pointer里面的內存地址是$00000000。指針 Pointer @ var p1,p2,p3:pointer S:String; I:Integer; begin p1:= Pointer(S); p2:= @S; P3:= pchar(s); // p1 和 p2 p3 有什么區(qū)別嗎? // Pointer(S)^ 字符串和Buffer
end; Pointer 是Borland VCL 的一個結構類型. 因此還有 PPointer 這樣一個東東呢!.指針的指針,如同管理類的類.
@是取地址的操作.什么都可以取地址.但取出來的不一定可以進行內容的訪問. 這就是一個數(shù)了,脫離了實際的現(xiàn)場就沒有意義了。(一個變量不可能下次還使用同一個物理內存吧 呵呵) pchar 指的是字符串數(shù)組的首地址. 后面連續(xù)的字符串直到 "\0" 結束. 雖說有些需用到的功能Delphi或第三方大都已提供元件或原始碼, 但如果欲從C++自己轉些碼來用真是麻煩, 看看下面 function GetHostAddress(const hostname : string) : u_long; var pHostAddr : PHostEnt; type T = ^u_long; begin pHostAddr := gethostbyname(PCHAR(hostname)); if (pHostAddr = nil) then begin result := 0; end else begin result := T(pHostAddr^.h_addr^)^; end; end; 想來必定是從C++直接按範例寫的, 但能看出在做什麼呢? 指標在Object Pascal Language Guide有提及, 還有Delphi學習筆記 也有一小段落也提起。 但以我的觀念, 大致上只會用到如此而已 type TStruct=record no:integer; name:string; end; PStruct=^TStruct; var i:integer; pi:PInteger; group:array[0..10] of TStruct; PMember:PStruct; begin pi:=@i; pi^:=10; ShowMessage(IntToStr(i)); PMember:=@group[0]; PMember.no:=1; PMember.name:='曾水舜'; Inc(PMember); PMember.no:=2; PMember.name:='sunshine'; ShowMessage(group[0].name); Dec(PMember); PMember^.name:='愛玩'; ShowMessage(group[0].name); end; 一起研究吧.... >我想大部分人用 delphi 來開發(fā)資料庫 >用到Pointer實在不多,很多事Delphi 已經(jīng)幫你做的好好地(如動態(tài)陣列) >不像 C++ 還要自己控制,So....至少到目前為止我只用過他在動態(tài) Record 上 >除非要做很低階控制,不過這可能不會用 delphi 來作吧 >anyway 手冊上那一本介紹pascal 講的蠻詳細地 >>經(jīng)常看到一些 Sample code 都會使用到 Pointer. 但不論中文或英文書都 >>什少提及 Pointer. 就算有頁數(shù)亦很少. 幾巳遺忘 Delphi 有 Pointer. 在Delphi中使用指針參數(shù) 在c語言中用function (int ^par)很方便,查過好多資料沒找到delphi的用法, 今晚沒事突然想起用delphi萬能指針pointer(無類型指針)應該可以代替。測試一下通過。 procedure xx(a:pchar); 【擴展信息:用 Javascript 實現(xiàn)的“Dua】 var tm:^tadodataset; begin tm:=pointer(a); ... end; procedure bb; var tm:tadodataset; begin tm... xx(@tm); end;
|