PChar与Pointer(100分)

  • 主题发起人 主题发起人 房客
  • 开始时间 开始时间

房客

Unregistered / Unconfirmed
GUEST, unregistred user!
PChar与Pointer的关系?如何<b>转化,转换</b>?

PChar的值是指向第一个字符.那个长度不是实际字符数, 而是字符串的最大长度
前导长度??
pchar 就是 CHAR叔祖,没有前导长度
ShortString/String(d2)有STRING[0]
ar<>string;string前有两个整型,记录长度和引用记数!
用GetMem为PChar分配内存, size应该为StrLen+5. 因为PChar字符串结构是头两个
字节用来表示PChar字符串的所占长度, 最后至少还要有一个表示字符串结束的0.
问题比较基本 请指点 谢谢
 
point 為一純粹之位址表示器,只是表示一個位址罷了,要使用需轉化成其他格式。
pchar 是個表明其單位為 char 的 point.

至於實際上 GetMem 是否如你所說的分配方式,不知道,
或許其內部結構是如此,但無所謂,
但是 GetMem 回傳給你的數值,其 pchar[0] 是可用的,
如是表示結構,你一挪用,即會出現系統錯誤訊息。
或許其結構為 頭字符+實際空間(012345...)
所以使用 GetMem 通常要 Size+1 才行,因為最後一碼為 00.

最後寫一簡單程序表示其關係!

procedure TForm1.Button1Click(Sender: TObject);
var
ph:Pchar;
pp:pointer;

ar:array[0..200] of char;

i,
w,p : integer;

pw:pWideChar;
wh:WideChar;
begin
ar[0]:='3';
ar[1]:='1';

pp:=@ar;
ph:=pp;


pw:=@ar;
wh:=pw[0];

i:=ord(ph[0]);
w:=ord(wh);

Edit1.text:=IntToHex(i,2)
// 值為 33
Edit2.text:=IntToHex(w,2)
// 值為 3133
// 瞭解了嗎!
end;
 
PChar就是Pointer的一种, 所以你可以把任何Pointer(甚至Integer)型转成PChar, 它只是
一个指针, 所以实际指向哪, 指向的是什么没有任何限制. 其它所有关于PChar的功能都是
编译器的功劳. 如果string转成的PChar, 那么这个PChar指向的是字符串具体内容开始的
第一个字节, 而PChar指向的地址-4才是string中表示具体字符串长度的内容. 如果为PChar
分配内存用以保存字符串的话, 只要比字符串内容多分配一个字节(存放字符#0)就够了.
如果PChar型字符串转成string时, 编译器会自动重新分配string的内存, 这个内存的大小
才是具体字串长度+5(+9?). 因为string的所有内存操作都是透明的, 所以你根本不必关心.
而这些跟PChar已经没有任何关系了.
总之你可以认为PChar就是Pointer, 只不过编译器对PChar做了更多的解释和功能扩充而已.
 
谢谢详细的回答 明白了关系
如何转化,转换?给分!
有函数再加分,呵呵
有什么资料多点 想知道多点
谢谢
 
在 32 位操作系统环境下,所有指针类型都是 32 位的。PChar 和 Pointer 都是指针类型,
只不过 Pointer 可以指代任何指针类型,比如以下转换:

function GetData(p_Data: Pointer
size: Integer): BOOL;
var
szBuf: PChar;
asStr: String
{ 如果打开 $H+ 编译指示或者允许“巨型字符串”,则 String 类型
默认与 AnsiString 类型相同 }
begin
if Assigned(p_Data) then
begin
szBuf := PChar(p_Data)
{ 将抽象的指针映射为 PChar 字符串指针 }
{ 可进行 PChar 字符串操作,与 C/C++ 的字符串操作类似 }
asStr := szBuf
{ 直接将 PChar 字符串转换为扩展的 Pascal 字符串 }
{ 不要再使用 asStr := StrPas(szBuf) 这种方法了,它只是为了
兼容 16 位的 Delphi 而保留的!}
{ 可进行 Pascal 字符串操作 }
szBuf := nil;
szBuf := StrAlloc(Length(asStr) + 1)
{ 分配内存 }
{ 因为最后还有一个 #0 字符做结尾 }
szBuf := PChar(asStr)
{ 直接将 String 类型转换为 PChar 类型 }
{ 同样不要使用 StrPCopy 函数了,它是为了兼容 16 位的
Delphi 而保留下来的 }
{ 对 szBuf 的一些操作处理 }
StrDispose(szBuf)
{ 释放分配给 szBuf 的内存}
{ ... }
end;
end;

 
多人接受答案了。
 
后退
顶部