原始翎风CLIENT8位 (7) 对于@(pcm^)的理解

发布时间 2023-11-30 15:00:23作者: D7mir

procedure TfrmMain.ClientGetMyMagics(body: string);
var
i: integer;
data: string;
pcm: PTClientMagic;
begin
for i := 0 to g_MagicList.Count - 1 do
Dispose(PTClientMagic(g_MagicList[i])); //释放指针,
g_MagicList.Clear; //清理列表
while TRUE do
begin
if body = '' then
break;
body := GetValidStr3(body, data, ['/']); //切割
if data <> '' then
begin
new(pcm);
//PCM 一个TClientMagic记录指针变量。取它的内容,就是一个指针值,怎么又取它的地址呢?
//或者这个@()表示一个强制 地址类型?不是的, @构造一个指向其操作数的指针
//理解下,这应该是规避类型不匹配,
//原型是DecodeBuffer(Src: string; Buf: PChar; bufsize: Integer);
// pcm^表示了pcm 所指向的东西,这里是一个TClientMagic记录,可以把它当一个整体变量来看
// 它没有名字,但是经过了一个这个类型的指针声明,分配内存new ,它又是实际存在的。对应基础变量类型是自动分配,不需要手动
// 再取这个东西的的地址,如果编译选项{$T-}没有打开,@返回的是一个通用的指针
// 作为参数传递给过程的 Buf: PChar,
//应该可以改写为pchar(pcm) ,确实可以通过编译,直接用PCM 就不行 ?
//[Error] ClMain.pas(6433): Incompatible types: 'TClientMagic' and 'Char'
// DecodeBuffer(data, PChar(pcm), sizeof(TClientMagic));
DecodeBuffer(data, @(pcm^), sizeof(TClientMagic));

g_MagicList.Add(pcm);

// PlayScene.MemoLog.Lines.Add(pcm.Def.sMagicName + IntToStr(MagicList.Count));
end
else
break;
end;
end;

 

看到一个过程,里面有 @(pcm^) 这个代码, 为什么这样写,

理解了下,指针是指针,应该是避免对地址的直接操作,总得给它起个名字来称呼, 

^ 取内容,有的人说是 去指针,也许更恰当些。

 

在一些地方,用到了 @(pcm^) 这种模式,我认为根本原因是为了避开类型的不匹配,一个是自定义的记录指针,一个是 PCHAR 指针