分享

【转】delphi中pointer的使用

 Gavin-book 2013-09-24

怎样才能访问pointer指针的所有数据?(最好有多种方法一起说明)
例:
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的问题,便和他一起推敲, 结果发现一个有趣的结论:Delphi里面, nil = 0; 想想,这也是很好理解的, 在32位Windows操作系统里面, 一个整数是32位, 一个指针也是32位的无符号整数。 但是,具体编程上的操作,却比较有趣, 各位老大请看: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 有什么区别吗?
// Pointer(S)^ 字符串和Buffer

end;

Pointer 是Borland VCL 的一个结构类型.
因此还有 PPointer 这样一个东东呢!.指针的指针,如同管理类的类.

@是取地址的操作.什么都可以取地址.但取出来的不一定可以进行内容的访问.
这就是一个数了,脱离了实际的现场就没有意义了。(一个变量不可能下次还使用同一个物理内存吧 呵呵)
pchar 指的是字符串数组的首地址. 后面连续的字符串直到 "\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 來開發資料庫
>用到Pointer實在不多,很多事Delphi 已經幫你做的好好地(如動態陣列)
>不像 C++ 還要自己控制,So....至少到目前為止我只用過他在動態 Record 上
>除非要做很低階控制,不過這可能不會用 delphi 來作吧
>anyway 手冊上那一本介紹pascal 講的蠻詳細地
>>經常看到一些 Sample code 都會使用到 Pointer. 但不論中文或英文書都
>>什少提及 Pointer. 就算有頁數亦很少. 幾巳遺忘 Delphi 有 Pointer.
在Delphi中使用指针参数
在c语言中用function (int ^par)很方便,查过好多资料没找到delphi的用法,
今晚没事突然想起用delphi万能指针pointer(无类型指针)应该可以代替。测试一下通过。
procedure xx(a:pchar); 【扩展信息:用 Javascript 实现的“Dua】
var
tm:^tadodataset;
begin
tm:=pointer(a);
...
end;
procedure bb;
var
tm:tadodataset;
begin
tm...
xx(@tm);
end;

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多